替换部分单词

时间:2017-09-07 14:07:56

标签: regex perl sed grep

我想用一个包含X的新单词_pt替换以X_pt模式结尾的单词(比如整个单词为grid%X),即单词的一部分不是将被替代。如何使用sed,grep + sed或任何其他Unix工具执行此操作?

以下内容仅删除了_pt,但未添加grid%

sed -i 's/_pt//g' x.f90

3 个答案:

答案 0 :(得分:2)

使用Perl:

perl -pe 's/(\w+?)_pt\b/grid%\1/g' file

请注意,-i选项也可用,用于就地修改文件,并可选择使用提供的扩展名保存旧文件。

答案 1 :(得分:1)

您可以像这样使用sed

sed -i -E "s/(.*?)_pt\b/grid%\1/g" file.txt

这是做什么的:

  • (.*?)匹配并分组任何字符,但?表示不匹配的匹配方法。
  • \b确保它是单词的结尾。

  • \1代表第一组,在我们的例子中是'_pt'之前的所有内容。

评论: sedawk是操纵者,grep只是类似搜索的内容,这意味着它无法替换字符串。

  

但这不行!为什么?因为基本的和扩展的posix正则表达式都不会将?视为逃避贪婪搜索。而是使用perl:

perl -pe 's|(*?)_pt\b|grid%\1|g'

答案 2 :(得分:0)

您可以将此gnu sed命令与字边界一起使用:

sed -E 's/\b([_[:alnum:]]+)_pt\b/grid%\1/g' file

在模式的任意一侧显示\b可确保我们仅匹配以_pt结尾的完整字词。

如果您使用的是OSX并且没有安装gnu sed,请使用:

sed -E 's/[[:<:]]([_[:alnum:]]+)_pt[[:>:]]/grid%\1/g' file