我正在尝试使用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}}
答案 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
答案 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"