줄 번호 집합의 경우...다른 패턴의 첫 번째 발생과 마지막 발생 사이의 내용을 추출합니다.

줄 번호 집합의 경우...다른 패턴의 첫 번째 발생과 마지막 발생 사이의 내용을 추출합니다.

파일에 이와 같은 것이 있습니다. 1,2,4의 줄 번호 목록이 있습니다.

  1. 모든 요구를 충족하는 라인 번호
  2. 사이의 콘텐츠 추출첫 번째의 출현과마지막일어난</book>

데이터:

</p><p>abc</p></book><book><p style="text-indent:0em;">def</p></book><book><p>ghi</p><p style="text-indent:0em;"></book><book><div><p>  
</div><p>123</p></book><book><p style="text-indent:0em;">456</p><p>789</p><p style="text-indent:0em;"></book><book><div><p>  
<div><p>nothing !!!</p></div>  
</p><p>ABC</p></book><book><p style="text-indent:0em;">DEF</p></book><book><p>GHI</p><p style="text-indent:0em;"></book><book><div><p>JKL</p></div></book><div>  

줄 번호를 입력하세요:1, 2, 4 (명령어에 입력하고 싶은 것)

원하는 출력:

<book><p style="text-indent:0em;">def</p></book><book><p>ghi</p><p style="text-indent:0em;"></book>
<book><p style="text-indent:0em;">456</p><p>789</p><p style="text-indent:0em;"></book>
<book><p style="text-indent:0em;">DEF</p></book><book><p>GHI</p><p style="text-indent:0em;"></book><book><div><p>JKL</p></div></book>

답변1

1) 특정 행 추출

4행 예제에서는 세 번째 행을 제거하여 첫 번째, 두 번째, 네 번째 행을 쉽게 추출할 수 있습니다.

sed 3d file

그러나 파일이 더 복잡할 수 있으므로 보다 일반적인 해결책은 다음과 같습니다.

sed -e 1b -e 2b -e 4b -e d file

따라서 유지해야 하는 각 줄에 대해 스크립트 끝으로 이동하여 b나머지 파일을 삭제할 수 있습니다.

더 긴 줄 번호 목록의 경우 스크립트를 생성해야 할 수도 있습니다.

sed $(for i in 1 2 4; do echo "-e ${i}b"; done) -e d file

그런데 문제는 줄 번호가 아니라 <book>줄에 s가 있는지 여부인 것 같습니다. 이것이 사실이라면 줄 번호를 잊어 버리고 다음을 수행하는 것이 좋습니다.

sed '/<book>/!d' 

2) 내용 추출

정규식은 *이런 종류의 작업에 적합하지 않습니다. 이것이 내 개인 버전에 일치하는 부분만 교체하는 sed명령 옵션이 있는 이유입니다 .oso

sed '/<book>/!d;s_<book>.*</book>_&_o' 

그러나 그것은 당신에게 효과가 없으므로 더 많은 정규식 저글링이 필요합니다.

sed '/<book>/!d;s_<book>_\n&_;s_.*\n__;s_\(.*</book>\).*_\1_' file

sed귀하의 버전이 대체 문자열을 지원하지 않는 경우 \n실제 개행 문자를 사용하십시오(백슬래시를 통해 이스케이프 처리됨).

sed '/<book>/!d;s_<book>_\
&_;s_.*\n__;s_\(.*</book>\).*_\1_' file

답변2

그리고 perl:

#!/usr/bin/env perl

use strict;
use warnings;

use v5.10;

my @lines = (1, 2, 4);

while(<>) {
    next unless $. ~~ @lines;
    chomp;
    s#.*?(<book>.*</book>).*#$1#;
    say
}

관련 정보