Shell

除非已經是 XML 實體的一部分,否則如何將“&”替換為“&”?

  • February 13, 2019

我有一個文件(xml),其中有很多&/</>/etc,但有時&它們本身也有一些字元。我想將此符號更改為&不替換其他符號。

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

這不起作用,因為它還替換了&s 中的 s &>例如。

怎麼做?

您可以先轉義&在實體中找到的 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 個)的 alnums(或下劃線)和sed開頭的東西都視為 XML 實體,而一個會更明確一個實體是(因為不會被視為一個實體)。在實踐中,它不太可能有很大的不同。&``#``;``sed``&#blah;

引用自:https://unix.stackexchange.com/questions/202684