すでに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'

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

関連情報