给定这样的文件:
a
b
a
b
我希望能够使用
sed
替换文件中包含“a”实例的最后一行。因此,如果我想用“c”替换它,那么输出应该如下所示:a
b
c
b
请注意,不管它可能遇到多少匹配项,也不管所需的模式或文件内容究竟是什么的详细信息,我都需要它来工作。提前谢谢。
最佳答案
不仅如此:
tac file | sed '/a/ {s//c/; :loop; n; b loop}' | tac
测试
% printf "%s\n" a b a b a b | tac | sed '/a/ {s//c/; :loop; n; b loop}' | tac
a
b
a
b
c
b
反转文件,然后对第一个匹配项进行替换,然后无条件地删除文件的其余部分。然后重新反转文件。
注意,一个空的regex(这里是
s//c/
)意味着重用以前的regex(/a/
)除了非常简单的程序之外,我不是一个sed的超级粉丝。我会用锥子:
tac file | awk '/a/ && !seen {sub(/a/, "c"); seen=1} 1' | tac