태그 끝에 필드를 추가하기 위해 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
sed
XML을 구문 분석하려면 다음과 같은 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"/>
ed
XML 트리를 편집하는 편집 모드를 나타냅니다 .-O
XML 태그를 생략합니다.- 우리는 뭔가를 삽입하고 싶습니다
--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
속성을 추가 할 수 있습니다.xq
yq
https://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 태그를 포함하기 위해 교체 모드에서 이를 사용합니다.