给定这样的文件:

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

10-06 07:37