이미 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'

그 중 하나는 , 선택 사항, 숫자(또는 밑줄) 및 sed밑줄로 시작하는 모든 XML 엔터티(최대 31개)를 XML 엔터티로 처리하기 때문에 그 중 하나는 좀 더 완화된 반면, 저 하나는 더 명시적입니다. 예(엔티티로 간주되지 않기 때문에). 실제로 이는 큰 영향을 미치지 않을 것입니다.&#;sed&#blah;

관련 정보