많은 문자가 포함된 파일(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;