多くの文字を含むファイル(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'
そのうちの1つは、オプション、数字(またはアンダースコア)、およびアンダーsed
スコアで始まるすべてのXMLエンティティ(最大31個)をXMLエンティティとして処理するため、その1つはもう少し軽減されますが、その1つはより明示的です。 。はい(エンティティとは見なされないため)。実際、これは大きな影響を与えません。&
#
;
sed
&#blah;