XML 파일에 다음과 같은 문자열이 있습니다.
<h3>Styled here with: <a href="$url('Product-Show','pid','107723102')$">FRS blo</a>, <a href="$url('Product-Show','pid','000482512')$">Os Cutes</a>&nbsp;and <a href="$url('Product-Show','pid','000312901')$">Dor Sho</a></p></short-description>
교체해야 해요 /p>
부분적으로 /h3>
.
나는 아래의 도움으로 그것을 시도합니다 sed
:
sed -i -e 's/<h3>Styled here with\:.*\/p>/<h3>Styled here with\:.*\/h3>/g' new_exp_dev02.xml
그러나 이것은 전혀 작동하지 않으며 결과는 두 배로 늘어납니다.
/p>
어쩌면 부품을 올바르게 교체하기 위해 더 많은 기호를 이스케이프 처리하는 것을 잊었나요 /h3>
?
답변1
sed
표현식에서 거의 모든 문자를 구분 기호로 사용할 수 있지만 이스케이프 오류를 제한하기 위해 바꾸려는 문자열에는 구분 기호를 사용하지 않는 것이 가장 좋습니다.
sed -e 's!/p>!/h3\>!g' new_exp_dev02.xml
/p>
로 대체하십시오 /h3>
. 대체의 앰퍼샌드( )는 대체 표현식에서 특별한 의미를 갖기 &
때문에 이스케이프되어야 합니다 .sed
올려주신 표현 sed
은 읽기도 어렵고 그것으로 무엇을 이루고자 하는지 잘 모르겠지만 " /p>
부품을 교체하다 /h3>
"와는 다른 목적을 가지고 있는 것 같습니다.
편집: 이 긴 형식으로 표현식을 작성해야 하는 경우 다음과 같이 작동합니다.
sed -e 's!\(<h3>Styled here with:.*\)/p>!\1/h3\>!g' new_exp_dev02.xml
그러면 일치하는 전체 부품이 역참조로 설정되어 /p>
교체 부품으로 사용할 수 있습니다 \1
. sed
정규식은 일치에만 사용되므로 교체 측에서는 정규식을 사용할 수 없습니다 .
이 답변의 첫 번째 표현식은 의 모든 항목을 대체하고 /p>
, /h3>
두 번째 표현식은 /p>
정규식과 일치한 직후에 발생하는 경우에만 대체됩니다."<h3>Styled here with:.*"
답변2
다음 perl 명령을 사용해 볼 수 있습니다
perl -pne "s/p>/h3>/g" filename
산출
<h3>Styled here with: <a href="$url('Product-Show','pid','107723102')$">FRS blo</a>, <a href="$url('Product-Show','pid','000482512')$">Os Cutes</a>&nbsp;and <a href="$url('Product-Show','pid','000312901')$">Dor Sho</a></h3></short-description>