텍스트 파일에서 미리 정의된 태그 사이의 줄 일부를 인쇄합니다.

텍스트 파일에서 미리 정의된 태그 사이의 줄 일부를 인쇄합니다.

아래와 같은 파일이 있습니다

<g> Good wheatear </g> other parts of line 
<g> The farm land is to be sold </g> other parts of line
<g> knock knock </g> other parts of line 

내 출력이 다음과 같기를 원합니다.

<g> Good wheatear </g> 
<g> The farm land is to be sold </g>
<g> knock knock </g>

즉, <g>와 </g> 태그 사이의 내용을 인쇄합니다(태그 포함).

나는 다음 명령을 시도했습니다.

awk '/<s>/, /<\/s>/' trsTest.txt

하지만 전체 줄을 인쇄합니다.

태그 사이에 내용을 인쇄하는 방법은 무엇입니까?

답변1

이를 통해 다음과 awk같이 될 수 있습니다.

$ awk -v FS="</?g>" '{print $2}' trsTest.txt
 Good wheatear
 The farm land is to be sold
 knock knock

또는 라벨을 유지하려는 경우:

$ awk -v FS="</g> " '{print $1 FS}' trsTest.txt
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>

답변2

간단히 GNU grep을 사용하여 줄( )에서 일치하는 부분만 인쇄할 수 있습니다 -o.

grep -o '<g>.*<\/g>' trsTest.txt

*쉘이 다음과 같은 문자를 확장하지 못하도록 패턴은 작은따옴표 사이에 있어야 합니다.

첫 번째 명령은 다음을 생성합니다.

<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>

태그를 포함하지 않으려면 다음을 수행할 수 있습니다.

sed 's/.*<g>\(.*\)<\/g>.*/\1/' trsTest.txt

작동 방식은 다음과 같습니다.

  • <g>시작 태그 앞의 모든 항목과 일치합니다(시작 태그 포함).
  • \(위의 내용을 사용했던 것을 기억합니다.\)
  • <\g>닫는 태그부터 줄 끝까지 일치합니다 .
  • 그런 다음 기억나는 것으로 바꾸세요.\1

두 번째 명령은 다음을 생성합니다.

 Good wheatear
 The farm land is to be sold
 knock knock

답변3

XML인 경우 XML 파서를 사용할 수 있습니다 xmlstarlet. 예를 들어 HTML인 경우에도 사용할 수 있지만 xmlstarlet구조가 깨질 수 있다는 점을 경고해야 합니다.

<root/>입력에 적합한 XML을 만들기 위해 테두리 요소를 추가했습니다 .

<root>
  <g> Good wheatear </g> other parts of line
  <g> The farm land is to be sold </g> other parts of line
  <g> knock knock </g> other parts of line
</root>

그런 다음 </g>요소와 값을 선택하는 명령은 다음과 같습니다.

xmlstarlet sel --template --match '//g' --copy-of '.' --nl file.xml

산출

<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>

xmlstarletPython이나 Python과 같은 범용 텍스트 구문 분석 도구 sed에 비해 장점은 grepXML 구조를 이해하므로 입력 파일이 약간 변경되었지만 여전히 유효한 XML로 남아 있으면 xmlstarlet구문 분석이 가능하다는 것입니다.

답변4

레이블이 항상 동일한 경우 레이블을 포함하려면 sed를 사용하십시오.

sed 's/\(.*>\).*/\1/' trsTest.txt

출력은 다음과 같습니다

<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>

Quasimodo의 코드 블록을 보다 효율적으로 업데이트했습니다.

관련 정보