sed 查找并替换 html 标签

sed 查找并替换 html 标签

我需要在 md 文件(纯文本)中查找并替换

<span class="symbol">&#58771;</span>

有了这个:

[&#58771;]{custom-style="symbol"}

我尝试了很多次,没有

sed -i -e 's/\(<span class=\"symbol\">\)&#58771;\(<\/span>\)/\[/&#58771;\]/\{custom-style=\"symbol\"\}/g'myfile.md

或者

sed -i -e "s#<span class=\"symbol\">&#58771;</span>#[&#58771;]{custom-style=\"symbol\"}#g" "Dignità umana e bioetica".md

但我总是收到一条错误消息,比如

sed: -e expression #1, char 40: unknown option to `s'

似乎有效(没有错误消息):

sed -i -e "s@<span class=\"symbol\">&#58771;</span>@[&#58771;]{custom-style=\"symbol\"}@g" myfile.md

但我得到这个代码

[<span class="symbol">&#58771;</span>#58771;]{custom-style="symbol"} 

新的字符串是添加,不更换旧的。

解决了

正如你所说,这个命令有效

sed -i -e 's@<span class="symbol">\&#58771;<\/span>@[\&#58771;]{custom-style="symbol"}@g'

答案1

这将起作用:

sed -i -e "s@<span class=\"symbol\">&#58771;</span>@[\&#58771;]{custom-style=\"symbol\"}@g" myfile.md

您需要使用\before &,那么它将正常工作,因为&替换文本很特殊:它意味着“与模式匹配的输入的整个部分”。

man sed

s/正则表达式/替换/

替换可能包含特殊字符 & 来引用模式空间中匹配的部分,以及特殊转义符 \1 到 \9 来引用正则表达式中相应的匹配子表达式。

答案2

这似乎对我有用

# echo '<span class="symbol">&#58771;</span>' > test 
# sed -i -e 's@<span class="symbol">\&#58771;<\/span>@[\&#58771;]{custom- 
style="symbol"}@g' test
# cat test 
[&#58771;]{custom-style="symbol"}

答案3

用 awk

echo "<span class="symbol">&#58771;</span>" |awk -F'=|>|<' 'BEGIN { OFS=""; }{ print "["$4"]","{cumtom-style=""\""$3"\"""}"}'
[&#58771;]{cumtom-style="symbol"}

答案4

您尝试的代码存在一些问题。

首先,如果您选择一个文本中不存在的字符作为命令的分隔符,事情会变得简单s///。或者,您必须使用\文本中出现的任意分隔符进行转义。

在你的第一个命令中,

sed -i -e 's/\(<span class=\"symbol\">\)&#58771;\(<\/span>\)/\[/&#58771;\]/\{custom-style=\"symbol\"\}/g'myfile.md

您得到的错误是由于/in引起的[/&#58771;\],它没有被转义。

此外,要将文字放入&输出文本中,您必须\在替换表达式中使用 a 对其进行转义。否则&被解释为特殊并替换为模式空间的匹配部分。

为了简单起见,我在这里删除了(可能?)不必要的转义字符和几个(可能?)不需要的/(来自[/&#58771;\]/\{custom-style=\"symbol\"\})。我还选择|作为命令的分隔符s///,因为它不会出现在您的输入文本中。命令变为:

sed -e 's|<span class="symbol">&#58771;</span>|[\&#58771;]{custom-style="symbol"}|g'

这就是它的作用:

$ echo '<span class="symbol">&#58771;</span>' | sed -e 's|<span class="symbol">&#58771;</span>|[\&#58771;]{custom-style="symbol"}|g'
[&#58771;]{custom-style="symbol"}

如果字符串&#58771;不是静态的,并且您想要替换它周围的<span class="symbol">with[</span>with ]{custom-style="symbol"},无论其值如何,您都可以使用捕获组 ( ()) 和反向引用(此处为\1):

sed -e 's|<span class="symbol">\(.*\)</span>|[\1]{custom-style="symbol"}|g'

该命令的作用:

$ echo '<span class="symbol">whatever is here</span>' | sed -e 's|<span class="symbol">\(.*\)</span>|[\1]{custom-style="symbol"}|g'
[whatever is here]{custom-style="symbol"}

最后,您通常可能更喜欢在脚本周围使用单引号 ( ') 而不是双引号 ( ") sed,以保护它们免受 shell 的$影响 - 由 触发的参数扩展,转义\...

相关内容