Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用sed替换正则表达式组_Regex_Bash_Sed - Fatal编程技术网

Regex 用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脚本左侧的整个字

我试图(用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脚本左侧的整个字符串。 换言之:我只想用“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无法做到这一点,因此这确实是最好的答案。非常感谢。