xmllint 및 egrep의 출력이 있고 인접한 두 필드를 인쇄하고 싶습니다. 예를 들어
(xmlinput) xmllint --format | egrep reference\|sourcefile
<reference>ItemX</reference>
<sourcefile>://filepath/blah/blah/</sourcefile>
<reference>ItemY</reference>
<sourcefile>://filepath/blah/blah/</sourcefile>
.
.
<reference>ItemW</reference>
<sourcefile>://filepath/blah/blah/</sourcefile>
참조 및 소스 파일 요소를 나란히 출력하는 방법이 있습니까? 예를 들어
(xmlinput) xmllint --format | egrep reference\|sourcefile
<reference>ItemX</reference><sourcefile>://filepath/blah/blah/</sourcefile>
<reference>ItemY</reference><sourcefile>://filepath/blah/blah/</sourcefile>
.
.
<reference>ItemW</reference><sourcefile>://filepath/blah/blah/</sourcefile>
답변1
[your command] | paste -d '' - -
연속된 줄을 연결합니다.
답변2
XML 작업을 시작하면 grep
입력에 대해 가정하게 되며 (거의 확실하게) 더 이상 유효한 XML 출력이 없으므로 이 방법이 최선의 방법이 아닐 때도 있습니다.
즉, 저항이 가장 적은 경로는 일반적 grep
으로 XML(형식이 잘 지정된 최소 예xmllint
유용할 것입니다), 다음과 같이 --xpath
( 지원을 xmllint
위해 >= 2.7.7 --xpath
) 사용할 수 있어야 합니다 :
xmllint --xpath "//reference|//sourcefile" input.xml |
pcregrep -o "(<reference>.*?</sourcefile>)"
xmllint
추출된 요소를 사용 하는X 경로|
관심 있는 요소 중 하나와 일치하는(논리적 OR로) 표현식입니다( //
입력의 어느 위치에서든 일치하는 모든 요소를 선택하기 위해). (비 XML 인식) 각 요소 쌍을 그룹 pcregrep
(대신 )과 일치시키고 일치하는 각 그룹을 한 줄에 출력합니다. 여기서 주목할 점은 PCRE라는 egrep
정규식 입니다..*?
탐욕스럽지 않은 일치그래서 일치한다최저 한도에서한 번에 전체 줄이 아닌 레이블 사이의 텍스트 양을 나타냅니다( xmllint --xpath ...
모든 것을 한 줄에 덤프).
grep을 사용하는 것은 약간의 "치트"입니다. 입력에 대해 가정을 하지만 xmllint
대부분의 무거운 작업을 수행합니다. 이 접근 방식은 향후 구문 분석 문제를 일으킬 수 있습니다.XML은 "정상"이 아닙니다정규 표현식은 작업에 가장 적합한 도구가 아닙니다.
이를 수행하는 깔끔한 방법은 다음과 같습니다.XML 스타:
xml select -t -m '//*' \
--if 'local-name()="reference"' -c . \
--elif 'local-name()="sourcefile"' -c . -o $'\n' input.xml
이는 모든 요소( //*
)를 검색하고 일치하면 <reference>
노드를 출력( -c .
)에 복사하고, 그렇지 않으면 <sourcefile>
추가 줄 바꿈( )을 사용하여 노드를 출력에 복사합니다 -o $'\n'
.
답변3
데이터를 파이프로 연결하면 됩니다.perl -pe 'chop if /^<reference>/'