명령줄을 통해 XML 파일의 태그에 속성을 추가하는 방법은 무엇입니까?

명령줄을 통해 XML 파일의 태그에 속성을 추가하는 방법은 무엇입니까?

태그 끝에 필드를 추가하기 위해 sed 스크립트를 사용하려고 합니다. XML 파일에 태그가 있다고 가정해 보겠습니다.

<book name="Sed tutorial" price="250"/>

Book_Width="A"이제 라벨 끝에 필드를 추가하여 <book/>라벨을 다음과 같이 만들고 싶습니다 .

<book name="Sed tutorial" price="250" Book_Width="A"/>

나는 전에 시도했습니다 sed:

sed '/<book "[^>]*>/ a Book_Width="A"'

그러나 그것은 다음을 제공합니다:

<book name="Sed tutorial" price="250"/>
Book_Width="A"

답변1

sedXML을 구문 분석하려면 다음과 같은 XML 구문 분석기를 사용하면 안 됩니다 xmlstarlet. 귀하의 작업에 대해서는 다음과 같습니다.

xmlstarlet ed -O --inplace --insert "/book" --type attr -n Book_Width -v A xml_file

그러면 파일 내용은 다음과 같습니다.

<book name="Sed tutorial" price="250" Book_Width="A"/>
  • edXML 트리를 편집하는 편집 모드를 나타냅니다 .
  • -OXML 태그를 생략합니다.
  • 우리는 뭔가를 삽입하고 싶습니다 --insert.
  • "/book"삽입된 경로입니다.
  • --type attr: 이것은 우리가 삽입하려는 속성입니다.
  • -n속성의 이름입니다.
  • -v.

답변2

"a" 에서는 sed새 줄에 패턴을 추가합니다.

당신이 해야 할 일은 교체( s대체)하는 것뿐입니다. 명확성을 위해 콜론을 구분 기호로 사용합니다.

sed 's:\(<book.*\)\(/>\):\1 Book_Width="A"\2:'

의 모든 것은 \( .. \)나타나는 순서대로 기억되고 호출되는 패턴입니다 \indexnumber. 예를 들어 \1저장된 첫 번째 패턴이 재현됩니다.

<book name="Sed tutorial" price="250"그래서 모드 1과 />모드 2를 기억하고 Book_Width="A"중간에 삽입합니다.

echo '<book name="Sed tutorial" price="250"/>' | sed 's:\(<book.*\)\(/>\):\1 Book_Width="A"\2:'
<book name="Sed tutorial" price="250" Book_Width="A"/>

답변3

질문에 표시된 것처럼 XML 파일이 실제로 node 가 있는 행이라고 가정하면 book(의 일부를 사용하여 Book_Width해당 노드에 book속성을 추가 할 수 있습니다.xqyqhttps://kislyuk.github.io/yq/)이와 같이:

$ xq -x '.book."@Book_Width" |= "A"' file.xml
<book name="Sed tutorial" price="250" Book_Width="A"></book>

데이터를 속성 값으로 삽입하려는 경우:

$ myvariable='20 cm'
$ xq -x --arg val "$myvariable" '.book."@Book_Width" |= $val' file.xml
<book name="Sed tutorial" price="250" Book_Width="20 cm"></book>

답변4

해결책은 sed외부 패키지나 명령을 사용하거나 사용하지 않는 것입니다.

echo '<book name="Sed tutorial" price="250"/>' |
sed 's/<book /& Book_Width="A"/'

산출:

<book Book_Width="A" name="Sed tutorial" price="250"/>

파일이 있는 경우.

sed 's/<book /& Book_Width="A"/' ${FILE_NAME}

또는 그 자리에서 교체하고 싶다면

sed -i 's/<book /& Book_Width="A"/' ${FILE_NAME}

&: 이 기호는 일치하는 문자열 전체를 나타내는 sed의 특수 문자, 즉 <book(space)입니다. 수정된 텍스트 내에 원본 <book 태그를 포함하기 위해 교체 모드에서 이를 사용합니다.

관련 정보