【问题标题】:sed replace exact match of the wordsed 替换单词的完全匹配
【发布时间】:2014-11-11 12:41:01
【问题描述】:

我有一种情况,我必须替换字符串中完全相同的单词。例如:

字符串:Dog DogCat CatDog Dog Cat Cdog ratdog Dog dog

我尝试了以下 cmd,但它不起作用,我使用 AIX:

echo "Dog DogCat CatDog Dog Cat Cdog ratdog Dog dog " | sed  -i 's/"\<Dog\>"/[[:blank:]]/' 

预期输出:DogCat CatDog Cat ratdog

请帮帮我。

-汉曼特

【问题讨论】:

  • “Cdog”去哪儿了?
  • 尝试删除双引号并使用文字空间作为替换。使用修饰符 g(用于全局研究)和 i(用于无案例研究)(将它们放在最后一个斜杠之后)

标签: regex replace sed match word


【解决方案1】:

首先,sed -i 'script' file 仅在您拥有 GNU sed 时才有效。您真的在 AIX 上安装了 GNU sed 吗?我对此表示怀疑。此外,-i 在这种情况下无论如何都没有任何意义。您正在修改来自管道而不是文件的流。

其次,POSIX 没有指定\&lt;\&gt;,尽管我知道至少GNU sed 和Solaris sed 接受它们。而 BSD sed 则使用 [[:&lt;:]][[:&gt;:]] 来匹配。

如果 AIX 上的 sed 接受 \&lt;\&gt; 分别匹配词首和词尾,并且它符合 POSIX,那么这可能会满足您的要求:

echo "Dog DogCat CatDog Dog Cat Cdog ratdog Dog dog " | sed 's/\<[Dd]og\>//g'

我也不明白你为什么将[[:blank:]] 这样的正则表达式结构放在 s 命令的替换部分。替换部分不是正则表达式。

对于 POSIX 兼容版本:

echo ... | sed 's/ [Dd]og  */ /g; s/^[Dd]og  *//; s/ [Dd]og$//'

【讨论】:

    【解决方案2】:

    你知道http://regex101.com/ 吗?在那里您可以直接测试您的正则表达式字符串...尝试将 [blank] 替换为 /[[:space:]]+/

    【讨论】:

    • 哇....这对我有用,感谢您对网站的引用,我将深入研究它。我知道我对正则表达式有点弱。
    • 非常感谢 Rento,你让我很开心 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多