Shell
除非已經是 XML 實體的一部分,否則如何將“&”替換為“&”?
我有一個文件(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;