Bash는 두 개의 인접한 결과를 출력합니다.

Bash는 두 개의 인접한 결과를 출력합니다.

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>/'

관련 정보