XML 엔터티 값을 정방향 조회로 대체

XML 엔터티 값을 정방향 조회로 대체

sed파일에 대해 매우 간단한 작업을 수행 하려고 합니다 .

sed 's:(?<=<Type>)default(?=</Type>):super:' < myfile.xml

개념은 매우 간단합니다. 적극적으로 둘러보고 태그를 찾은 다음 콘텐츠를 "super"로 바꾸세요. 불행히도 작동하지 않으며 아무것도 교체되지 않습니다. 내가 뭘 잘못했나요?

다음과 유사한 파일을 "편집"하려고 합니다.

<Hello>
    <World>
        <Type>default</Type>
    </World>
</Hello>

다음과 같이 만드세요:

<Hello>
    <World>
        <Type>super</Type>
    </World>
</Hello>

답변1

정규식은 정확하지만 sed둘러보기를 처리하지 않습니다. 귀하의 코드는 다음을 사용하여 정상적으로 작동합니다 perl.

perl -pe 's:(?<=<Type>)default(?=</Type>):super:' your.file

정규식은 일반적으로 XML 처리에 적합하지 않으므로 시도해 보는 것이 좋습니다.XML 스타:

xml ed -O -u '//Type' -v 'super' your.file

perlxml제자리에서 편집할 수 있으므로 교체가 필요하지 않습니다 sed.

답변2

sed와 함께 Perl 정규식 구문을 사용하려고 하면 작동하지 않습니다. Sed가 사용하는 것기본 정규식펄은확장 정규식그리고더 많은 기능. Lookaround는 Perl의 고유한 기능 중 하나입니다. 다른 최신 정규식 구현에서는 찾을 수 있지만 sed에서는 찾을 수 없습니다.

여기서는 둘러볼 필요가 없습니다. 바꾸려는 패턴의 시작이나 끝 부분에 있는 전방 탐색을 변수 대체 텍스트로 쉽게 변환할 수 있습니다. 당신은 또한 볼 수 있습니다일치하는 패턴을 따르는 줄 부분만 반환더 많은 예와 설명을 보려면

sed 's:\(<Type>\)default\(</Type>\):\1super\2:'

여기서는 역방향 조회와 정방향 조회가 일정하므로 간단한 문자열 교체도 수행할 수 있습니다.

sed 's:<Type>default</Type>:<Type>super</Type>:'

답변3

입력의 어느 부분이 가변적이고 어느 부분이 상수인지 잘 모르겠습니다. Type가 변수이고 가 default상수 super라고 가정하면 다음 sed스크립트를 사용할 수 있습니다.

s:<\([^>]\+\)>default</\1>:<\1>super</\1>:

관련 정보