bash를 사용하여 xml 파일의 html 문자 엔터티 바꾸기

bash를 사용하여 xml 파일의 html 문자 엔터티 바꾸기

XML 파일에 다음과 같은 문자열이 있습니다.

&lt;h3&gt;Styled here with: &lt;a href="$url('Product-Show','pid','107723102')$"&gt;FRS blo&lt;/a&gt;, &lt;a href="$url('Product-Show','pid','000482512')$"&gt;Os Cutes&lt;/a&gt;&amp;nbsp;and &lt;a href="$url('Product-Show','pid','000312901')$"&gt;Dor Sho&lt;/a&gt;&lt;/p&gt;</short-description>

교체해야 해요 /p&gt부분적으로 /h3&gt.

나는 아래의 도움으로 그것을 시도합니다 sed:

sed -i -e 's/&lt;h3&gt;Styled here with\:.*\/p&gt;/&lt;h3&gt;Styled here with\:.*\/h3&gt;/g' new_exp_dev02.xml

그러나 이것은 전혀 작동하지 않으며 결과는 두 배로 늘어납니다.

/p&gt어쩌면 부품을 올바르게 교체하기 위해 더 많은 기호를 이스케이프 처리하는 것을 잊었나요 /h3&gt?

답변1

sed표현식에서 거의 모든 문자를 구분 기호로 사용할 수 있지만 이스케이프 오류를 제한하기 위해 바꾸려는 문자열에는 구분 기호를 사용하지 않는 것이 가장 좋습니다.

sed -e 's!/p&gt!/h3\&gt!g' new_exp_dev02.xml/p&gt로 대체하십시오 /h3&gt. 대체의 앰퍼샌드( )는 대체 표현식에서 특별한 의미를 갖기 &때문에 이스케이프되어야 합니다 .sed

올려주신 표현 sed은 읽기도 어렵고 그것으로 무엇을 이루고자 하는지 잘 모르겠지만 " /p&gt부품을 교체하다 /h3&gt"와는 다른 목적을 가지고 있는 것 같습니다.

편집: 이 긴 형식으로 표현식을 작성해야 하는 경우 다음과 같이 작동합니다.

sed -e 's!\(&lt;h3&gt;Styled here with:.*\)/p&gt;!\1/h3\&gt;!g' new_exp_dev02.xml

그러면 일치하는 전체 부품이 역참조로 설정되어 /p&gt교체 부품으로 사용할 수 있습니다 \1. sed정규식은 일치에만 사용되므로 교체 측에서는 정규식을 사용할 수 없습니다 .

이 답변의 첫 번째 표현식은 의 모든 항목을 대체하고 /p&gt, /h3&gt두 번째 표현식은 /p&gt정규식과 일치한 직후에 발생하는 경우에만 대체됩니다."&lt;h3&gt;Styled here with:.*"

답변2

다음 perl 명령을 사용해 볼 수 있습니다

 perl -pne "s/p&gt/h3&gt/g" filename

산출

&lt;h3&gt;Styled here with: &lt;a href="$url('Product-Show','pid','107723102')$"&gt;FRS blo&lt;/a&gt;, &lt;a href="$url('Product-Show','pid','000482512')$"&gt;Os Cutes&lt;/a&gt;&amp;nbsp;and &lt;a href="$url('Product-Show','pid','000312901')$"&gt;Dor Sho&lt;/a&gt;&lt;/h3&gt;</short-description>

관련 정보