![sed 将缺少一个字母的单词替换为完整单词](https://linux22.com/image/166634/sed%20%E5%B0%86%E7%BC%BA%E5%B0%91%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AF%8D%E7%9A%84%E5%8D%95%E8%AF%8D%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%AE%8C%E6%95%B4%E5%8D%95%E8%AF%8D.png)
我有大量需要包含名称的文件
Jacqueline
但相反,它们包含以下内容:
Jacquelin
但有时也
fooJacquelinbar
或者
123Jacquelin123
或者
/Jacquelin/
如何用 替换每个实例Jacquelin
,Jacqueline
而不以类似的方式结束Jacquelinee
?
我尝试过的是:
find . -name '*' -type f -exec sed -i 's/\bJacquelin\b/Jacqueline/g' {} +
但这不会替换附加任何内容的实例"Jacquelin"
(与整个单词不匹配)。
答案1
也试试
sed 's/\(Jacquelin\)e\?/\1e/g' file
或者
sed -r 's/(Jacquelin)e?/\1e/g' file
答案2
我建议使用 Perl 来利用负向预测
perl -pe 's/Jacquelin(?!e)/Jacqueline/g'
它将替换当Jacquelin
后面没有紧跟该字符时e
(包括如果后面没有字符)
要就地批量编辑文件,您可以添加-i
标志:
find . -name '*' -type f -exec perl -pi -e 's/Jacquelin(?!e)/Jacqueline/g' {} +
请记住事先备份,因为操作是不可逆的