我有一个包含许多字符的文件(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;