Regex 用sed替换正则表达式组
我试图(用sed)替换一个与正则表达式匹配的组,但我能从测试中得到的最好结果是替换sed分隔符右侧的整个字符串 例如:Regex 用sed替换正则表达式组,regex,bash,sed,Regex,Bash,Sed,我试图(用sed)替换一个与正则表达式匹配的组,但我能从测试中得到的最好结果是替换sed分隔符右侧的整个字符串 例如: echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g" 输出: this is a sample 421 string 期望输出: this is a sample id='1' string 这可能吗?怎么做 编辑: 我试图做的是实际上只替换正则表达式匹配的组,而不是sed脚本左侧的整个字
echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"
输出:
this is a sample 421 string
期望输出:
this is a sample id='1' string
这可能吗?怎么做
编辑:
我试图做的是实际上只替换正则表达式匹配的组,而不是sed脚本左侧的整个字符串。
换言之:我只想用“1”替换“42”,而不使用“id=”。可能是这样
$ echo "this is a sample id='42' string" | sed -r "s/id='.*?'/id='1'/g"
结果:
这是一个示例id='1'字符串
或者您可以这样做:
$ echo "this is a sample id='42' string" | sed -r "s/(id=')(.*?)(')/\11\3/g"
this is a sample id='1' string
结果:
这是一个示例id='1'字符串
在
sed
中,整个左正则表达式由整个右正则表达式重新定距。如果要保留左侧正则表达式的一部分,则必须将其显式复制到右侧,或者将其设置为捕获组:
echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"
将正确地用421
替换所有匹配项id='42'
,因为\1
是42
。如果要保留标有id=…
的零件,必须将其放入替换件中:
echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/id='1'/g"
下面是在
awk
echo "this is a sample id='42' string" | awk -F\' '{$2=1}1' OFS=\'
this is a sample id='1' string
它使用“
作为字段分隔符,然后只替换字段2中的值
这也应该起作用:
awk -F\' '$2=1' OFS=\'
你的意思不清楚。你能用更多的例子来改进解释吗?@fedorqui Done,请参阅editmm然后从我删除的答案中,这应该是-->
echo“这是一个示例id='42'字符串”| sed-r“s/'[^']*'/'5'/'
。也就是说,只需在单引号之间勾选任何内容。@fedorqui不,您仍然在使用'
和5
。'
在我的组之外(id='(.*?)
)。我只想替换(.*)
。然后您可以捕获它们并打印回来。请注意,当使用sed s/sth/new/g
时,sth
将替换为new
,因此如果在sth
中有它,则必须在new
中重新打印。因此,您可以执行sed-r“s/(')[^']*(')/\15\2/“,尽管它看起来有点太多。不,请参阅我问题下的注释。这绝对不是我想要的。AFAIK sed没有前瞻(前向|后向)功能,所以整个模式无论如何都会被某些东西所取代。但是,如果您的模式像您的示例那样简单,那么将其复制到替换零件似乎没有问题。我添加了另一个选项,没有将该模式作为常量重复,仅作为组副本。sed中没有非捕获括号,这是最好的答案IMHO。这实际上可以工作。我在寻找一些不需要从字符串的左侧复制到右侧的解决方案,但我刚刚意识到sed无法做到这一点,因此这确实是最好的答案。非常感谢。