Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 如何使用sed从第n行中删除最后第n个字符?_Awk_Sed - Fatal编程技术网

Awk 如何使用sed从第n行中删除最后第n个字符?

Awk 如何使用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 ~

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 ~/.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
中尝试以下内容吗。用GNU
awk
编写和测试

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}