강한 타격을 사용하고,
문서:
<?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 데이터를 구문 분석합니다. 그리고xmlstarlet이는 단지 XPath 연습이 됩니다.
$ branch=$(xmlstarlet sel -t -v '//blah1[@name="andy"]/@branch' file.xml)
$ echo $branch
master
답변2
그리고 grep
:
grep -Pio 'name="andy".*branch="\K[^"]*' file
-P
Perl 정규식 활성화(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 기술에 대해 더 많이 아는 사람들이 많다는 것을 알고 있으므로 비판을 받을 준비가 되어 있습니다. :-)