Awk 如何使用sed从第n行中删除最后第n个字符?
Ubuntu 16.04Awk 如何使用sed从第n行中删除最后第n个字符?,awk,sed,Awk,Sed,Ubuntu 16.04 Bash 4.4 我想从第n行中删除最后第n个字符。这是一个简单的文件,每行的最后4个字符是数字4 root@0o0o0o0o0 ~/.ssh # cat remove.txt 00000000004444 55555555555555555555555554444 222222222222222224444 000033334444 111114444 要从每行中删除最后4个字符,我可以执行sed-I的/…$/'remove.txt root@0o0o0o0o0 ~
Bash 4.4 我想从第n行中删除最后第n个字符。这是一个简单的文件,每行的最后4个字符是数字4
root@0o0o0o0o0 ~/.ssh # cat remove.txt
00000000004444
55555555555555555555555554444
222222222222222224444
000033334444
111114444
要从每行中删除最后4个字符,我可以执行sed-I的/…$/'remove.txt
root@0o0o0o0o0 ~/.ssh # sed -i 's/....$//' remove.txt
root@0o0o0o0o0 ~/.ssh # cat remove.txt
0000000000
5555555555555555555555555
22222222222222222
00003333
11111
但是,如果我想从第4行中删除最后4个字符,删除3个字符,那么文件将如下所示:
0000000000
5555555555555555555555555
22222222222222222
0000
11111
使用GNU时:
sed -i 's/....$//; 4s/....$//' file
4s/…$/
将搜索和替换限制在第四行
请参见:
man sed
和info sed
您可以在awk
中尝试以下内容吗。用GNUawk
编写和测试
awk -v line="4" -v nofChar="4" '
{
sub(".{"nofChar"}$","")
}
FNR==line{
sub(".{"nofChar"}$","")
}
1
' Input_file
详细说明:
awk -v line="4" -v nofChar="4" ' ##Starting awk program and setting line variable value, nofChar variable value here.
{
sub(".{"nofChar"}$","") ##Substituting last nofChar number of characters at last of the each line here.
}
FNR==line{ ##Checking if this is same line which OP wants to do 2nd time substitution.
sub(".{"nofChar"}$","") ##Substituting last nofChar number of characters at last of the each line here.
}
1 ##Mentioning 1 will print edited/non-edited line.
' Input_file ##Mentioning Input_file name here.
第二种解决方案:如果所有行中的字符数与特定行不同,请尝试以下操作。必须更改名为
nofUsualChar
value的变量
awk -v line="4" -v nofChar="4" -v nofUsualChar="4" '
{
sub(".{"nofUsualChar"}$","")
}
FNR==line{
sub(".{"nofChar"}$","")
}
1
' Input_file
或者
sed-Ei的/{4}$/;4s/{4}$/'文件
如果有大量字符要删除。因为命令较长,所以在这里没有真正的意义。@Freddy只是为了让我能更清楚地理解,现在我想删除第30行的最后3个字符。我应该选择两个不同的数字。s
之前的第一个数字是行号,{…}
中的数字是要在结尾处替换的字符数。$
。请注意,一行必须有足够的字符才能执行此操作,否则不会删除任何内容。如果不能保证,那么您可以在Cyrus的解决方案中将每个
替换为\?
,或者在Freddy的解决方案中将每个{4}
替换为{0,4}
。