如何修复以下sed命令?

时间:2015-06-02 15:13:23

标签: regex linux unix replace sed

我正在尝试将_out附加到与下面的sed命令中显示的正则表达式匹配的任何内容中。 _out应该在[ (]之前。

sed -n '/[^_]lm[01?]_.*[ (]/p'

该命令正如我所期望的那样正确返回行。现在问题来自于我尝试以下命令,我在其中定义了要在替换中使用的区域。

例如,如果我匹配lm?_whatever(,则应将其替换为lm?_whatever_out(

我用过

sed 's/\([^_]lm[01?]_.*\)\([ (]\)/\1_out\2/g' text_to_edit

正如你可能猜到我不走运。我做错了什么?

编辑:

这是一个解释更多的例子:

案文:

this will make absolutely no sense=lm?_hello <= four_lm1_hi(5:0) bla bla
lm1_blabbering(5:0) 

应该变成

this will make absolutely no sense=lm?_hello_out <= four_lm1_hi(5:0) bla bla
lm1_blabbering_out(5:0) 

1 个答案:

答案 0 :(得分:4)

为了仅匹配您的lm字词而不影响以下字词,您需要限制模式。我建议将.*转为[^[:blank:]]*以匹配 0或更多字符而不是空格或标签

sed 's/\([^_]lm[01?]_[^[:blank:]]*\)\([ (]\)/\1_out\2/g' text_to_edit

(编辑)或者,如果_之间的唯一字符是字母数字字符,则可以使用[[:alnum:]]字符类:

sed 's/\([^_]lm[01?]_[[:alnum:]_]*\)\(.\)/\1_out\2/g' text_to_edit

这样,我们确保只匹配lm?_hellolm1_blabbering