如何用“&”替换“&”,除非已经是 XML 实体的一部分?

如何用“&”替换“&”,除非已经是 XML 实体的一部分?

我有一个包含许多字符的文件(xml)&/</>/etc,但有时也有一些&字符本身。我想更改此符号&而不替换其他符号。

cat file.xml | sed s/"&"/"&"/g | sed s/"&"/"&"/g > new_file.xml

例如,这不起作用,因为它还替换了&中找到的 s &>

怎么做?

答案1

您可以首先转义&实体中的when,然后替换其余的。喜欢:

LC_ALL=C sed 's/_/_u/g; # use _ as an escape character. Here escape itself
              s/&\([[:alpha:]][[:alnum:]]*;\)/_a\1/g; # replace & with _a when in entities
              s/&\(#[0-9]\{1,8\};\)/_a\1/g; # Ӓ case
              s/&\(#x[0-9a-fA-F]\{1,8\};\)/_a\1/g; # ꯍ case
              s/&/\&/g; # now convert the non-escaped &s
              s/_a/\&/g;s/_u/_/g; # restore escaped & and _'

perl

perl -pe 's/&(?!#?\w{1,31};)/&/g'

那个比那个更宽松一点,因为它将把任何以、可选的和任意数量(最多 31 个)的数字(或下划线)和sed开头的 XML 实体视为 XML 实体,而那个则更明确地说明什么实体是(因为不会被视为实体)。实际上,这不太可能产生很大的影响。&#;sed&#blah;

相关内容