在特定行间隔之间,每隔N行用sed替换一个单词

在特定行间隔之间,每隔N行用sed替换一个单词,sed,Sed,我有一个输入文件: Line 1 a Line 2 b Line 3 c Line 4 d Line 5 e Line 6 f Line 7 g Line 8 h Line 9 i Line 10 j Line 11 k Line 12 l Line 13 m Line 14 n Line 15 o Line 16 p Line 17 q . . . 我想用sed在一个特定的行间隔中插入,比如在文件的第3行和第17行之间,每4行插入一个单词来替换每行的最后一个单词 在这种情况下,假设我想在文件

我有一个输入文件:

Line 1 a
Line 2 b
Line 3 c
Line 4 d
Line 5 e
Line 6 f
Line 7 g
Line 8 h
Line 9 i
Line 10 j
Line 11 k
Line 12 l
Line 13 m
Line 14 n
Line 15 o
Line 16 p
Line 17 q
.
.
.
我想用sed在一个特定的行间隔中插入,比如在文件的第3行和第17行之间,每4行插入一个单词来替换每行的最后一个单词

在这种情况下,假设我想在文件的第3行,然后是文件的第7行(即3+4),然后是文件的第11行(即7+4),然后是文件的第15行(即11+4)中放置一个
Z

有没有一种方法可以通过sed实现这一点,但只打开一次我要更改的文件

预期产出将是:

Line 1 a
Line 2 b
Line 3 Z
Line 4 d
Line 5 e
Line 6 f
Line 7 Z
Line 8 h
Line 9 i
Line 10 j
Line 11 Z
Line 12 l
Line 13 m
Line 14 n
Line 15 Z
Line 16 p
Line 17 q
.
.
.

如果您有GNU sed,您可以使用以下表格:

首先,我们将所有操作限制在
3,17{…}
的地址范围内

然后,在花括号内,我们运行以下命令:

3~4s/\S*$/Z/

“在第3行和之后的每4行,将该行的最后一个字(
\S*$
–非空格字符的最长序列)替换为
Z

如果您使用了GNU,您可以使用以下格式:

首先,我们将所有操作限制在
3,17{…}
的地址范围内

然后,在花括号内,我们运行以下命令:

3~4s/\S*$/Z/

“在第3行和之后的每4行,将该行的最后一个字(
\S*$
–最长的非空格字符序列)替换为
Z

使用POSIX sed,您可以执行以下操作:

sed '3,17{s/[^ ]*$/Z/;n;n;n;}'
另一种选择是
awk
,它可以变得更加灵活:

awk 'NR==3,NR==17{if (c++%4==0) { $NF="Z" }}1'

使用POSIX sed,您可以执行以下操作:

sed '3,17{s/[^ ]*$/Z/;n;n;n;}'
另一种选择是
awk
,它可以变得更加灵活:

awk 'NR==3,NR==17{if (c++%4==0) { $NF="Z" }}1'

在sed之外生成所需的行:例如
seq 46 44 180
。使用该命令生成sed命令。在sed之外生成所需的行:例如
seq 46 44 180
。使用它来生成sed命令。