我想在最后一个匹配后插入一个字符串,例如:
要在香蕉的最后一个实例之后插入的字符串: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
无论何种情况都应正确处理在哪里它发生在输入中。在写入任何输出之前,它也不需要读取整个输入文件。