使用 sed 替换字符串的一部分,保持正则表达式所表示的其他部分不变

使用 sed 替换字符串的一部分,保持正则表达式所表示的其他部分不变

假设你想替换句子的一部分,而让其他部分用正则表达式 (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

相关内容