[shell] awk / sed로 여러 번 나타날 수있는 두 마커 패턴 사이의 선을 선택하는 방법

두 개의 다른 마커 패턴 사이에 발생하는 선을 사용 awk하거나 sed어떻게 선택할 수 있습니까? 이러한 패턴으로 표시된 여러 섹션이있을 수 있습니다.

예 : 파일에 다음이 포함되어 있다고 가정합니다.

abc
def1
ghi1
jkl1
mno
abc
def2
ghi2
jkl2
mno
pqr
stu

그리고 시작 패턴 abc이고 종료 패턴은 다음 과 mno
같이 출력이 필요합니다.

def1
ghi1
jkl1
def2
ghi2
jkl2

sed를 사용하여 패턴을 한 번 일치시킵니다.

sed -e '1,/abc/d' -e '/mno/,$d' <FILE>

어떠한 방법이 sedawk 파일이 끝날 때까지 반복적으로 수행하는가?



답변

awk필요한 경우 인쇄를 트리거하려면 플래그와 함께 사용하십시오 .

$ awk '/abc/{flag=1;next}/mno/{flag=0}flag' file
def1
ghi1
jkl1
def2
ghi2
jkl2

어떻게 작동합니까?

  • /abc/이 텍스트가있는 줄과 일치합니다 /mno/.
  • /abc/{flag=1;next}flag텍스트 abc가 발견 되는 시기를 설정합니다 . 그런 다음 줄을 건너 뜁니다.
  • /mno/{flag=0}flag텍스트 mno가 발견 되면 설정을 해제합니다 .
  • 마지막이 flag되는 기본 동작과 패턴 인 print $0경우 : flagIS는 줄이 인쇄된다 (1)과 동일.

패턴이 표시되거나 표시되지 않는 경우와 함께 자세한 설명과 예 는 두 패턴 사이의 선을 선택하는 방법을 참조하세요 . .


답변

사용 sed:

sed -n -e '/^abc$/,/^mno$/{ /^abc$/d; /^mno$/d; p; }'

-n옵션은 기본적으로 인쇄하지 않음을 의미합니다.

패턴은 just abcto just을 포함하는 행을 mno찾은 다음 { ... }. 첫 번째 조치는 abc행을 삭제합니다 . 두 번째 mno줄; 그리고는 p나머지 라인을 인쇄합니다. 필요에 따라 정규식을 완화 할 수 있습니다. abc.. 범위를 벗어난 줄 mno은 인쇄되지 않습니다.


답변

이것은 당신을 위해 일할 것입니다 (GNU sed) :

sed '/^abc$/,/^mno$/{//!b};d' file

시작 줄 abc과 줄 사이의 줄을 제외한 모든 줄을 삭제합니다.mno


답변

sed '/^abc$/,/^mno$/!d;//d' file

뽀통 보다 두 자 더 나은 골프 {//!b};d

빈 슬래시 //는 “마지막으로 사용한 정규식 재사용”을 의미합니다. 그리고 명령은 더 이해하기 쉬운 것과 동일합니다.

sed '/^abc$/,/^mno$/!d;/^abc$/d;/^mno$/d' file

이것은 POSIX 인 것 같습니다 .

RE가 비어있는 경우 (즉, 패턴이 지정되지 않음) sed는 마지막으로 적용된 명령 (주소 또는 대체 명령의 일부로)에 사용 된 마지막 RE가 지정된 것처럼 동작합니다.


답변

이전 응답의 링크 ksh에서 솔라리스에서 실행되는 나를 위해 한 것은 다음과 같습니다.

sed '1,/firstmatch/d;/secondmatch/,$d'
  • 1,/firstmatch/d: 1 행부터를 처음 찾을 때까지 firstmatch삭제합니다.
  • /secondmatch/,$d: 처음부터 secondmatch파일 끝까지 삭제합니다.
  • 세미콜론은 순서대로 실행되는 두 명령을 구분합니다.

답변

perl -lne 'print if((/abc/../mno/) && !(/abc/||/mno/))' your_file


답변

이 같은 것이 나를 위해 작동합니다.

file.awk :

BEGIN {
    record=0
}

/^abc$/ {
    record=1
}

/^mno$/ {
    record=0;
    print "s="s;
    s=""
}

!/^abc|mno$/ {
    if (record==1) {
        s = s"\n"$0
    }
}

사용 : awk -f file.awk data

편집 : O_o fedorqui 솔루션은 내 것보다 훨씬 더 / 예쁘다.