在注释之前使用sed替换同一行中的多个实例

时间:2015-07-13 14:53:52

标签: regex bash sed

我正在尝试使用sed用变量替换命令的所有实例,期望它们在注释之后或者是另一个单词的一部分。我已经接近,能够在评论之前替换一个实例,但如果有多个则不能。

我有一行测试文件: $RM $RM # rm

我想这样读: sed -i 's/\(^\|[^[#.*]]\)\brm\b/\1$RM/' file1

这是我到目前为止所做的: $RM rm # rm

返回: "$#" #rm # rm rm # rm rm "rm " 'rm ' `rm ` {rm } $# rm # rm rm rm # rm rm # rm rm rmremovermlink

非常感谢任何帮助。其他不涉及sed的解决方案是受欢迎的,但我可能需要一些帮助来理解它们。

谢谢!

编辑:

这只是我要找的一个例子。并非每一行都会像这样格式化,并且不是每一行都会在注释之前包含命令,反之亦然。我只是在寻找一个解决方案,它也将涵盖与此示例类似的情况。很抱歉没有解释。这是一个稍微好一点的例子:

  "$#"    #rm
#  rm
$RM   #  rm
  $RM
"$RM  "
'$RM  '
`$RM  `
{$RM  }
$#  $RM  # rm
$RM $RM # rm
$RM # rm rm
rmremovermlink

输出应为:

{{1}}

3 个答案:

答案 0 :(得分:0)

\$[A-Z]{2}\s\$[A-Z]{2}\s\#\s[a-z]{2}

如果您正在寻找,请告诉我。匹配:

$RM $RM # rm

答案 1 :(得分:0)

您可以使用此perl命令进行此替换:

perl -pe 's/(?<!\$)#.*$(*SKIP)(*F)|\brm\b/\$RM/g' file
   "$#"    #rm
#  rm
$RM   #  rm
  $RM
"$RM  "
'$RM  '
`$RM  `
{$RM  }
$#  $RM  # rm
$RM $RM # rm
$RM # rm rm
rmremovermlink

RegEx Demo

答案 2 :(得分:0)

您可以使用此sed命令:

sed ':a;s/^\([^#]*\)\<rm\>/\1$RM/;ta;' file
#    ^  ^   ^       ^   ^  ^      ^---- go to label "a" is something is replaced
#    |  |   |       |   |  '---- back-reference to capture group 1
#    |  |   |       '---'---- word boundaries
#    |  |   '---- capture group 1
#    |  '---- replacement (only one occurrence)
#    '---- defines the label "a"