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

时间:2018-11-21 14:47:30

标签: 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行替换每行的最后一个单词。

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

有没有办法使用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
.
.
.

2 个答案:

答案 0 :(得分:2)

如果您使用GNU sed,则可以使用first~step line addressing格式:

sed '3,17{3~4s/\S*$/Z/}' infile

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

然后,在花括号中运行以下代码:

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

“在第3行及其后的第4行,用\S*$替换行的最后一个单词(Z –最长的非空格字符序列)”。

答案 1 :(得分:0)

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

sed '3,17{s/[^ ]*$/Z/;n;n;n;}'

可以选择awk,使其更加灵活:

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