我想用一个包含X的新单词_pt
替换以X_pt
模式结尾的单词(比如整个单词为grid%X
),即单词的一部分不是将被替代。如何使用sed,grep + sed或任何其他Unix工具执行此操作?
以下内容仅删除了_pt
,但未添加grid%
:
sed -i 's/_pt//g' x.f90
答案 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'
之前的所有内容。
评论: sed
和awk
是操纵者,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