我有一个输入文件:
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
.
.
.
答案 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'