Regex 使用sed替换注释前同一行中的多个实例
我试图使用sed将命令的所有实例替换为变量,当它们出现在注释之后或是另一个单词的一部分时除外。我已经接近了,能够在注释之前替换一个实例,但如果有多个实例,就不能 我有一个测试文件,其中有一行:Regex 使用sed替换注释前同一行中的多个实例,regex,bash,sed,Regex,Bash,Sed,我试图使用sed将命令的所有实例替换为变量,当它们出现在注释之后或是另一个单词的一部分时除外。我已经接近了,能够在注释之前替换一个实例,但如果有多个实例,就不能 我有一个测试文件,其中有一行: rm#rm 我想这样说: $RM$RM#RM 这就是我到目前为止所做的: sed-i的/\(^\\[^[\\.]]\)\brm\b/\1$RM/'文件1 返回: $RM#RM 非常感谢您的帮助。其他不涉及sed的解决方案是受欢迎的,但我可能需要一些帮助来理解它们 谢谢 编辑: 这只是我正在寻找的一个例子。
rm#rm
我想这样说:
$RM$RM#RM
这就是我到目前为止所做的:
sed-i的/\(^\\[^[\\.]]\)\brm\b/\1$RM/'文件1
返回:
$RM#RM
非常感谢您的帮助。其他不涉及sed的解决方案是受欢迎的,但我可能需要一些帮助来理解它们
谢谢
编辑:
这只是我正在寻找的一个例子。不是每一行都会这样格式化,也不是每一行都会在注释前包含命令,反之亦然。我只是在寻找一个解决方案,也将涵盖类似于此示例的情况。对不起,没有解释。下面是一个稍微好一点的例子:
"$#" #rm
# rm
rm # rm
rm
"rm "
'rm '
`rm `
{rm }
$# rm # rm
rm rm # rm
rm # rm rm
rmremovermlink
输出应为:
"$#" #rm
# rm
$RM # rm
$RM
"$RM "
'$RM '
`$RM `
{$RM }
$# $RM # rm
$RM $RM # rm
$RM # rm rm
rmremovermlink
如果这是你要找的,请告诉我。它匹配:
$RM $RM # rm
您可以使用此
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
perl-pe的/(?您可以使用以下sed命令:
sed ':a;s/^\([^#]*\)\<rm\>/\1$RM/;ta;' file
# ^ ^ ^ ^ ^ ^ ^---- go to label "a" if something is replaced
# | | | | | '---- back-reference to capture group 1
# | | | '---'---- word boundaries
# | | '---- capture group 1
# | '---- replacement (only one occurrence)
# '---- defines the label "a"
sed”:a;s/^\([^\\]*\)\/\1$RM/;ta;'文件
#^^^^^^^^----如果某件东西被替换,则转到标签“a”
#| | | | |'——返回到捕获组1的引用
#| | |-----单词边界
#| |“--捕获组1
#|'----替换(仅一次)
#'----定义标签“a”
所以,我想我的问题不太清楚。对不起,我正在寻找一种方法来替换命令,而不知道它可能在哪里。这个答案适用于这种特定情况,但不幸的是,我不知道这些行将如何格式化。你能提供两个示例来代替你问题中的示例进行测试吗。谢谢。什么以上输入文件的预期输出是什么?不,不,不在注释中。用预期输出更新问题。效果非常好!感谢包含RegEx演示。这对理解为什么一切都是这样非常有帮助。
sed ':a;s/^\([^#]*\)\<rm\>/\1$RM/;ta;' file
# ^ ^ ^ ^ ^ ^ ^---- go to label "a" if something is replaced
# | | | | | '---- back-reference to capture group 1
# | | | '---'---- word boundaries
# | | '---- capture group 1
# | '---- replacement (only one occurrence)
# '---- defines the label "a"