我有一个简单的用例,我有一个文件,比如
line_1
anything
anything
anything
aaa
line_2
line_3
anything
anything
anything
aaa
anything
anything
line_4
aaa
现在我必须替换line_3
之后的第一个aaa
。
输出-
line_1
anything
anything
anything
aaa
line_2
line_3
anything
anything
anything
YES REPLACE THIS
anything
anything
line_4
aaa
我可以替换下一行的任何内容-
sed -i '/line_3/{n; s/aaa/YES REPLACE THIS/}' file.txt
但是aaa
不是下一行,我不知道它发生了多少行,任何使用sed
,awk
或任何bash相关的解决方案都将工作,任何帮助都将不胜感激。
6条答案
按热度按时间kiayqfof1#
使用
awk
ekqde3dh2#
一旦它看到
line_3
就设置一个标志,一旦它找到并替换了模式就取消设置这只会将结果行打印到屏幕上。如果你想改变文件(“就地”),添加
-i
开关(perl -i -wpe'...'
),或者更好的-i.bak
来保留备份。ffvjumwh3#
使用
sed
pepwfjgg4#
这是(由当前接受的答案)提出的:
它简化为:
但是触发器操作员为我们做了很多工作!
请参阅Specifying file to process to Perl one-liner。
nvbavucw5#
在
perl
中仅使用替换,令file.txt
内容为然后
给出输出
说明:
-p
和-e
表示类似于sed
工作,-0777
表示将整个文件作为一行推进。s/
-替换,/s
-使.
也匹配换行符,我匹配line_3
和非贪婪地搜索aaa\n
之前的任何字符,并将其全部替换为我在aaa\n
之前匹配的字符,表示为(
和)
,后面跟着YES REPLACE THIS\n
。fdx2calv6#
ed
适用于自动编辑文件:找到与
line_3
匹配的第一行,然后c更改与aaa
匹配的第一行之后的第一行,最后w将修改后的文件重新写入。