Bash Sed反向引用工作不正常

Bash Sed反向引用工作不正常,bash,sed,Bash,Sed,测试数据: <img src=\"images/docs/mydash_grooms.png\" alt=\"\" /> Sed: sed's/ Sed的输出: <a class=\"popup-image\" href=\"images/docs/m\"><img src=\"images/docs/tn.mydash_grooms.png\" alt=\"\" /> 为什么我的反向引用在两次使用时都不能正常工作 努力实现: 更改: <im

测试数据:

<img src=\"images/docs/mydash_grooms.png\" alt=\"\" />

Sed:

sed's/
Sed的输出:

<a class=\"popup-image\" href=\"images/docs/m\"><img src=\"images/docs/tn.mydash_grooms.png\" alt=\"\" />

为什么我的反向引用在两次使用时都不能正常工作

努力实现: 更改:

<img src=\"images/docs/mydash_grooms.png\" alt=\"\" />


你必须避开\所以它们实际上变成了“\\”。但是,还必须转义/,这使得字符串非常复杂。我建议将sed的分隔符(即“/”)替换为另一个字符,以避免复杂的字符串。例如,使用@

sed 's@<img src=\\"images/docs/\(.*\)\\" alt=\\"\\" />@<a class=\\"popup-image\\" href=\\"images/docs/\1\\"><img src=\\"images/docs/tn.\1\\" alt=\\"\\" />@g' test.txt
sed's@@@g'test.txt
此外,请更换[[:graph:],它不适合我。

这可能适合您(GNU-sed):


将该行保存在保留空间中,然后更改该行以复制第一个属性。追加原始行并在文件名中插入
tn.

您能在sed中使用
\s
[[:graph:]]
之类的东西吗?当然,我的捕获可以在第二次调用\1时工作,而不是第一次。我想是这样。你的意思是只捕获一个字符吗?我的意思是捕获:mydash_grooms.png,它在我第二次调用\1时起作用,额外的反斜杠是因为这是来自mysqldump,我需要转义引号。既然你已经发布了输入数据,我认为需要额外的反斜杠。但是如果你想捕捉多个字母,你需要一个量词。尝试使用
\([^\\]\+\)
(一个或多个反斜杠以外的任何字符)代替
\([[:图形:]\)
<a class=\"popup-image\" href=\"images/docs/mydash_grooms.png\"><img src=\"images/docs/tn.mydash_grooms.png\" alt=\"\" />
sed 's@<img src=\\"images/docs/\(.*\)\\" alt=\\"\\" />@<a class=\\"popup-image\\" href=\\"images/docs/\1\\"><img src=\\"images/docs/tn.\1\\" alt=\\"\\" />@g' test.txt
sed -r 'h;s|img src(.*) alt.*|a class=\\"popup-image\\" href\1>|;G;s/\n//;s|(.*/)([^>])|\1tn.\2|' file