![使用 sed 替换字符串的一部分,保持正则表达式所表示的其他部分不变](https://linux22.com/image/1616290/%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%EF%BC%8C%E4%BF%9D%E6%8C%81%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%89%80%E8%A1%A8%E7%A4%BA%E7%9A%84%E5%85%B6%E4%BB%96%E9%83%A8%E5%88%86%E4%B8%8D%E5%8F%98.png)
假设你想替换句子的一部分,而让其他部分用正则表达式 (regex) 来表示未变。例如,这是一个文本文件
文本1.txt
A Egg
b Egg
C Egg
D Egg
E Pig
您想将其更改为
A Chick
b Egg
C Chick
D Chick
E Pig
在这种情况下,Egg
每行中的任意大写字母、空格和Egg
都变成了Chick
。在正则表达式中,目标模式可以用来表示[A-Z] Egg
。
如何用☆ Chick
☆ 替换原始大写字母?下面的命令不起作用/不应该起作用,但希望它能帮助您理解我想要什么...
sed -i "s/[A-Z] Egg/[A-Z] Chick/g" ./text*.txt # incorrect
答案1
使用保留第一个大写字母的捕获组:
sed "s/\([A-Z]\) Egg/\1 Chick/" file.txt
A Chick
b Egg
C Chick
D Chick
E Pig
在哪里:
\([A-Z]\)
是包含第一个大写字母的捕获组 1\1
是对组 1 的反向引用(即组 1 的内容)
我已经删除了-i
显示结果的选项,如果您想就地替换,请使用它。
如果要在所有文件中进行就地替换text*.txt
:
sed -i "s/\([A-Z]\) Egg/\1 Chick/" text*.txt