XML에서 속성값 추출

XML에서 속성값 추출

강한 타격을 사용하고,

문서:

<?xml version="1.0" encoding="UTF-8"?>
<blah>
    <blah1 path="er" name="andy" remote="origin" branch="master" tag="true" />
    <blah1 path="er/er1" name="Roger" remote="origin" branch="childbranch" tag="true" />
    <blah1 path="er/er2" name="Steven" remote="origin" branch="master" tag="true" />

</blah>

나는 다음을 시도했습니다 :

grep -i 'name="andy" remote="origin" branch=".*\"' <filename>

그러나 전체 행을 반환합니다.

<blah1 path="er" name="andy" remote="origin" branch="master" tag="true" />

다음을 기준으로 행을 일치시키고 싶습니다.

name="andy"

나는 단지 그것이 돌아오기를 원한다:

master

답변1

XML 파서를 사용하여 XML 데이터를 구문 분석합니다. 그리고이는 단지 XPath 연습이 됩니다.

$ branch=$(xmlstarlet sel -t -v '//blah1[@name="andy"]/@branch' file.xml)
$ echo $branch
master

답변2

그리고 grep:

grep -Pio 'name="andy".*branch="\K[^"]*' file
  • -PPerl 정규식 활성화(PCRE)
  • -i대소문자 무시
  • -o일치하는 부분만 인쇄

정규식에서는 \K너비가 0인 뒤돌아보기를 사용하여 이전 부분을 일치시키지만 \K일치 항목에는 포함시키지 않습니다.

답변3

xmllint를 사용하여 XPath를 통해 속성 값을 추출합니다.

xmllint --xpath 'string(/blah/blah1[@name="andy"]/@branch)' file.xml

속성의 순서가 변경되고 줄 바꿈이 삽입되어 이름과 분기 속성이 파일의 다른 줄에 있을 수 있으므로 XML 구문 분석기를 사용하여 XML을 처리하는 것이 가장 좋습니다.

답변4

나는 이것이 효과가 있다고 생각합니다 :

$ grep -i 'name="andy" remote="origin" branch=".*\"' <filename> | awk -F' ' '{print $5}' | sed -E 's/branch=\"(.*)\"/\1/'
master

awk섹션에서는 큰따옴표와 참조 사이의 내용( 괄호 사이의 부분 일치와 일치) 만 branch="master"반환 되도록 합니다.sed\1

이제 여기 awk 및 sed 기술에 대해 더 많이 아는 사람들이 많다는 것을 알고 있으므로 비판을 받을 준비가 되어 있습니다. :-)

관련 정보