XML 파일에서 문자열을 바꾸는 방법은 무엇입니까?

XML 파일에서 문자열을 바꾸는 방법은 무엇입니까?

XML 파일의 문자열을 바꾸려고 합니다.

~에서

<hello="value" exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,aa=bb ccc,dd=eeee,ff=gggg,hh=iii,jj=kkk,ll=mmmm" />

난 그냥 바꾸고 싶어

aa=bb ccc,dd=eeee

그리고

xx=yy yyy,zz=aaaa,bb=cc ddd

이 목표를 달성하는 방법은 무엇입니까? 감사해요

답변1

XML이 잘 구성되어 있고 다음과 같다고 가정합니다.

<?xml version="1.0"?>
<root>
  <hello exmapleno="Other attribute's value"/>
  <hello exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,aa=bb ccc,dd=eeee,ff=gggg,hh=iii,jj=kkk,ll=mmmm"/>
</root>

aa=bb ccc,dd=eeee...그런 다음 다음을 사용하여 노드의 속성 값 일부를 바꿀 수 있습니다 .examplenohelloxmlstarlet

xmlstarlet edit \
    --var searchstring '"aa=bb ccc,dd=eeee"' \
    --var replacement  '"xx=yy yyy,zz=aaaa,bb=cc ddd"'  \
    --update '//hello/@exampleno[contains(.,$searchstring)]' \
    --expr 'concat(
        substring-before(.,$searchstring),
        $replacement,
        substring-after(.,$searchstring)
    )' file.xml

( --var변수는 Xpath 표현식이므로 문자열에는 리터럴 큰따옴표가 포함되어야 합니다.)

또는 XPath 표현식에 멋진 변수가 없으면 다음을 수행합니다.

xmlstarlet edit \
    --update '//hello/@exampleno[contains(.,"aa=bb ccc,dd=eeee")]' \
    --expr 'concat(
        substring-before(.,"aa=bb ccc,dd=eeee"),
        "xx=yy yyy,zz=aaaa,bb=cc ddd",
        substring-after(.,"aa=bb ccc,dd=eeee")
    )' file.xml

이렇게 하면 수정됩니다모두 hello문서에는 exampleno검색 문자열이 있는 속성을 가진 노드가 포함되어 있습니다. 이러한 노드 중 하나를 수동으로 선택한 다음 than을 사용하시겠습니까 //hello?

이 명령의 목적은 XPath 표현식 //node/@exampleno(즉, exampleno모든 hello노드의 속성)과 일치하는 모든 노드를 찾는 것입니다. 추가 조건은 값에 검색 문자열이 포함되어야 한다는 것입니다. 그런 다음 표현식을 기반으로 일치하는 속성의 값을 업데이트합니다 --expr. 이 표현식은 대상 문자열(첫 번째 발생) 앞뒤에 있는 속성 값 부분을 선택하고 그 사이의 새 문자열과 연결합니다.

출력은 터미널에 기록되지만 적절한 이름의 options 을 사용하여 그 자리에서 편집하게 됩니다 --inplace.

단축된 옵션 이름을 사용하여 테스트 실행:

$ xmlstarlet ed --var s '"aa=bb ccc,dd=eeee"' --var r '"xx=yy yyy,zz=aaaa,bb=cc ddd"' -u '//hello/@exampleno[contains(.,$s)]' -x 'concat(substring-before(.,$s),$r,substring-after(.,$s))' file.xml
<?xml version="1.0"?>
<root>
  <hello exmapleno="Other attribute's value"/>
  <hello exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,xx=yy yyy,zz=aaaa,bb=cc ddd,ff=gggg,hh=iii,jj=kkk,ll=mmmm"/>
</root>

답변2

나는 xmlstarlet당신이 요청한 이후로 설치하고 싶지 않다고 가정합니다.여기서도 같은 문제가 발생합니다유닉스 명령만 필요하다고 언급했습니다.

첫 번째:
같은 질문을 두 번 하지 마세요!
다른 방법으로 이 작업을 수행하고 싶다고 언급하려면 주석을 사용하세요.

추가 소프트웨어를 설치하고 싶지 않기 때문에 "unix 명령"을 언급했다고 가정합니다.

오늘날 대부분의 UNIX 기반 운영 체제에는 이미 기본 설치에 Perl이 포함되어 있으므로 다음을 수행할 수 있습니다.

perl -pne 's/aa=bb ccc,dd=eeee/xx=yy yyy,zz=aaaa,bb=cc ddd/' < file.xml > file2.xml

추가 소프트웨어를 설치할 필요가 없습니다.

관련 정보