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