파일의 특정 태그에서 문자열 값 가져오기

파일의 특정 태그에서 문자열 값 가져오기

태그로 구분된 메시지가 포함된 대용량 파일이 있습니다 <>.

전체 태그(값 포함)를 가져와야 합니다. 아래 예를 참조하세요.

<tvd:HostProductListStatus>000</tvd:HostProductListStatus><tvd:BeefProductListStatus>000</tvd:BeefProductListStatus><tvd:CustomerBranding>CC</tvd:CustomerBranding><tvd:InquiryAllowed>true</tvd:InquiryAllowed>

그냥 가져와서 표시하면 돼요오직다음 태그: 여러 번 나타나는지 여부에 관계없이 파일의 값:

<tvd:BeefProductListStatus>000</tvd:BeefProductListStatus>

이를 수행하는 명령은 무엇입니까?

답변1

입력 및 출력을 게시한다고 가정하면 GNU grep을 사용하고 다음이라는 파일을 사용하여 수행할 수 있습니다 input.

<input grep '<tvd:BeefProductListStatus>[^<]*</tvd:BeefProductListStatus>' -o -m1 \
| head -n1

grep -o일치하는 부분만 인쇄해야 하며, 동일한 라인에서 여러 인스턴스가 일치하는 것을 방지 [^<]*하고 첫 번째 일치 라인 이후에 중지해야 합니다. 같은 줄에 레이블이 지정된 데이터의 두 인스턴스가 있으면 grep이 각각을 출력하게 되므로 첫 번째 일치 항목으로만 잘라야 합니다.<tvd:BeefProductListStatus>-m1head -n1

답변2

  1. 여러 줄 모드에서 작동하려면 레이블을 \n으로 변경하세요.
  2. 여러 줄 모드에서 값을 추출하고 값을 저장하여 공간을 절약합니다.
  3. 마지막 행이 주어지면 홀드 공간에서 패턴 공간까지 값을 가져옵니다.
  4. 모든 값을 레이블로 바꾸고 결과를 인쇄하십시오.

sed -rn '
    s/<tvd:BeefProductListStatus>/\n/g;
    s/([^<]*).*/\1/Mg; H;               
    ${ g; s/\n+/ /g;
       s#\b(\w+)\b#<tvd:BeefProductListStatus>\1</tvd:BeefProductListStatus>\n#gp
     }
' file
<tvd:BeefProductListStatus>000</tvd:BeefProductListStatus>
<tvd:BeefProductListStatus>111</tvd:BeefProductListStatus>
<tvd:BeefProductListStatus>000</tvd:BeefProductListStatus>

관련 정보