Shell 在最后一个匹配后附加字符串

Shell 在最后一个匹配后附加字符串

我想在最后一个匹配后插入一个字符串,例如:

要在香蕉的最后一个实例之后插入的字符串:Orange

输入

Apple
Banana
Apple
Banana

输出

Apple
Banana
Apple
Banana
Orange

我正在尝试使用 XML 标签来做到这一点。我已经弄清楚如何添加开始标签。

答案1

简短而简单,要做确切地问了什么:

printf '%s\n' '0?Banana?a' Orange . x | ex file.txt

如果您想查看将要保存到文件中的内容(而不是立即保存修改),请使用:

printf '%s\n' '0?Banana?a' Orange . %p | ex file.txt

这是做什么的:

从文件的最开始 ( 0) 搜索向后( ?regex?) 表示“Banana”的下一个实例(环绕),然后附加 ( a) 行“Orange”。期间结束追加,保存x并退出。

答案2

tac a | sed '0,/Banana/{s/Banana/Orange\nBanana/}' | tac

会做的 !

编辑:修改了这个问题的答案 -https://stackoverflow.com/questions/18291341/sed-only-the-last-match-pattern

答案3

sed -e:n -e'/\n.*Banana/!{$!{N' \
         -e'/Banana/bn' -eb -e\}\
         -e's/\n/&Orange&/;t'   \
         -e'/Banana/a\' -eOrange\
    -e\} -e'P;D' <<\IN
Apple
Banana
Apple
Banana
IN

Apple
Banana
Apple
Banana
Orange

这应该工作得相当可靠。它将在模式空间中缓冲之间的出现次数Banana在输入中 - 当有新的缓冲区组匹配时,将最后一个缓冲区组的全部内容打印到 stdout。并且最后一次出现的Banana无论何种情况都应正确处理在哪里它发生在输入中。在写入任何输出之前,它也不需要读取整个输入文件。

相关内容