我需要在 md 文件(纯文本)中查找并替换
<span class="symbol"></span>
有了这个:
[]{custom-style="symbol"}
我尝试了很多次,没有
sed -i -e 's/\(<span class=\"symbol\">\)\(<\/span>\)/\[/\]/\{custom-style=\"symbol\"\}/g'myfile.md
或者
sed -i -e "s#<span class=\"symbol\"></span>#[]{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\"></span>@[]{custom-style=\"symbol\"}@g" myfile.md
但我得到这个代码
[<span class="symbol"></span>#58771;]{custom-style="symbol"}
新的字符串是添加,不更换旧的。
解决了
正如你所说,这个命令有效
sed -i -e 's@<span class="symbol">\<\/span>@[\]{custom-style="symbol"}@g'
答案1
这将起作用:
sed -i -e "s@<span class=\"symbol\"></span>@[\]{custom-style=\"symbol\"}@g" myfile.md
您需要使用\
before &
,那么它将正常工作,因为&
替换文本很特殊:它意味着“与模式匹配的输入的整个部分”。
从man sed
:
s/正则表达式/替换/
替换可能包含特殊字符 & 来引用模式空间中匹配的部分,以及特殊转义符 \1 到 \9 来引用正则表达式中相应的匹配子表达式。
答案2
这似乎对我有用
# echo '<span class="symbol"></span>' > test
# sed -i -e 's@<span class="symbol">\<\/span>@[\]{custom-
style="symbol"}@g' test
# cat test
[]{custom-style="symbol"}
答案3
用 awk
echo "<span class="symbol"></span>" |awk -F'=|>|<' 'BEGIN { OFS=""; }{ print "["$4"]","{cumtom-style=""\""$3"\"""}"}'
[]{cumtom-style="symbol"}
答案4
您尝试的代码存在一些问题。
首先,如果您选择一个文本中不存在的字符作为命令的分隔符,事情会变得简单s///
。或者,您必须使用\
文本中出现的任意分隔符进行转义。
在你的第一个命令中,
sed -i -e 's/\(<span class=\"symbol\">\)\(<\/span>\)/\[/\]/\{custom-style=\"symbol\"\}/g'myfile.md
您得到的错误是由于/
in引起的[/\]
,它没有被转义。
此外,要将文字放入&
输出文本中,您必须\
在替换表达式中使用 a 对其进行转义。否则&
被解释为特殊并替换为模式空间的匹配部分。
为了简单起见,我在这里删除了(可能?)不必要的转义字符和几个(可能?)不需要的/
(来自[/\]/\{custom-style=\"symbol\"\}
)。我还选择|
作为命令的分隔符s///
,因为它不会出现在您的输入文本中。命令变为:
sed -e 's|<span class="symbol"></span>|[\]{custom-style="symbol"}|g'
这就是它的作用:
$ echo '<span class="symbol"></span>' | sed -e 's|<span class="symbol"></span>|[\]{custom-style="symbol"}|g'
[]{custom-style="symbol"}
如果字符串
不是静态的,并且您想要替换它周围的<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 的$
影响 - 由 触发的参数扩展,转义\
...