Que*_*low 5 sed text-processing regular-expression replace
我有一个像这样的替换列表:
search_and -> replace
big_boy -> bb
little_boy -> lb
good_dog -> gd
...
Run Code Online (Sandbox Code Playgroud)
我需要替换上述内容,但同时避免匹配像这样更长的字符串:
big_boys
good_little_boy
Run Code Online (Sandbox Code Playgroud)
我试过这个:
sed -i -r "s/$(\W){search}(\W)/$\1{replacement}\2/g"
Run Code Online (Sandbox Code Playgroud)
但是当字符串(在这种情况下为“good_dog”)出现在一行的末尾时,上述内容不起作用,如下所示:
Mary had a 'little_boy', good_little_boy, $big_boy, big_boys and good_dog
Mary had a 'lb', good_little_boy, $bb, big_boys and good_dog
Run Code Online (Sandbox Code Playgroud)
而且我怀疑当字符串也出现在行首时,上述内容是否有效。有没有好办法进行搜索和替换?
如果您使用的是 GNU sed(裸露-i
表明您使用的是 GNU sed),则存在“单词边界”转义\b
:
sed -i "s/\b$SEARCH\b/$REPLACE/g"
Run Code Online (Sandbox Code Playgroud)
\b
在单词边界上完全匹配:一侧的字符是“单词”字符,而另一侧的字符不是。它是零宽度匹配,因此您不需要使用捕获子组来保留 和 的\1
值\2
。还有一种\B
,恰恰相反。
如果您不使用 GNU sed,则可以在捕获子模式中使用行首和行尾的交替:(\W|^)
。这将匹配非单词字符或行的开头,并且(\W|$)
将匹配非单词字符或行的结尾。在这种情况下,您仍按原样使用\1
and 。\2
无论如何,一些非 GNUsed
确实支持\b
,至少在扩展模式下,所以无论如何都值得一试。