Sed通配符- 替换特定字符中间的内容

3

我有一行代码像这样

"RU_28" "CDM_279" "CDI_45"
"RU_567" "CDM_528" "CDI_10000"

我希望能获得以下的结果

"RU_28" "CDM_Unusued" "CDI_45"
"RU_567" "CDM_Unusued" "CDI_10000"

针对文件中的所有行都执行此操作。

我正在使用以下命令:

sed 's/\"CDM_\w*\"/\"Unusued\"/g' File1.txt > File2.txt

它似乎不能工作。

提前致谢!


你使用的操作系统和 sed 版本是什么? - Dan Fego
SunOS 5.10,恐怕我找不到sed版本。 - rualonor
2个回答

2

您可以使用:

sed -i.bak 's/"\(CDM_\)[^"]*"/"\1Unused"/' file1.txt

请随意使用 sed 's/"\(CDM_\)[^"]*"/"\1Unused"/' file1.txt > file2.txt - anubhava
如果你不想保留CDM_并且想用"CDM_*"替换未使用的内容,那么你不需要这些括号,对吗? - rualonor
我不需要使用\1来调用标记的子表达式,大家加油! - rualonor
是的,你甚至可以这样做:sed -i.bak 's/"CDM_[^"]*"/"CDM_Unused"/' file1.txt - anubhava

1
你实际上没有在右侧保留“CDM_”。你的替换规则是“用Unused替换CDM_和任意数量的单词”。实现你想要的效果的常见方法是,在你想要保留的左侧部分使用括号,然后使用反向引用来指示它们在右侧的位置。在这种情况下,你只需要一个单一的反向引用,用\1表示:
sed 's/"\(CDM_\)\w*"/"\1Unusued"/g' File1.txt > File2.txt

请注意左侧括号前面的反斜杠;如果使用sed进行扩展正则表达式,可以省略这些反斜杠(我想),但是现在,它们是必需的,以便sed知道它们不是字面值。

编辑:根据Birei的准确评论,我已更新命令,指出双引号的多余转义符。(请注意,括号的转义符仍然是必需的)。


+1 是因为它有效,但在单引号之间的表达式中不必转义双引号。还要注意 \w 是 GNU 扩展。 - Birei
谢谢,但它似乎没有修改我的文件,文件仍然是原来的样子,我的命令也是一样。我还尝试了通配符,我注意到了变化,但不是我期望的。sed 's/"CDM_*"/"CDM_Unusued"/' - rualonor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接