如何在字符串中搜索特定单词/模式的最后一个出现位置并将其替换为另一个单词?例如,搜索词为“aaa”,替换词为“zzz”。输入为“aaa bbb ccc bbb aaa”,期望输出为“aaa bbb ccc bbb zzz”。命令“s/aaa/zzz/”只能替换第一个匹配项。是否有其他选项可以进行反向搜索?
x='aaa bbb ccc bbb aaa'
sed 's/\(.*\)bbb/\1zzz/' <<< "$x"
aaa bbb ccc zzz aaa
sed不支持预测先行断言,如果您想尝试使用perl:
perl -pe 's/aaa(?!.*?aaa)/zzz/' <<< "$x"
aaa bbb ccc bbb zzz
如果我们反转字符串,使用sed更改反转字符串中的第一个出现的字符,然后再将结果反转回正常顺序,会发生什么:
#!/bin/bash
str="aaa bbb ccc bbb aaa"
echo "${str}" | rev | sed 's/bbb/zzz/' | rev
如果我们只需要替换一个符号,它可以正常工作。对于单词,您需要同时反转模式和替换单词。
echo "aaa bbb ccc bbb aaa" | sed 's/aaa$/zzz/'
,但这被称为脆弱解决方案。 (您可以使用's/aaa[ ]*$/zzz/'
考虑行末的额外空格,但仍然脆弱;-))。祝好运。 - shellterbbb
替换为yyy
呢? :P - jkshah