[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>
어떠한 방법이 sed
나 awk
파일이 끝날 때까지 반복적으로 수행하는가?
답변
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
경우 :flag
IS는 줄이 인쇄된다 (1)과 동일.
패턴이 표시되거나 표시되지 않는 경우와 함께 자세한 설명과 예 는 두 패턴 사이의 선을 선택하는 방법을 참조하세요 . .
답변
사용 sed
:
sed -n -e '/^abc$/,/^mno$/{ /^abc$/d; /^mno$/d; p; }'
이 -n
옵션은 기본적으로 인쇄하지 않음을 의미합니다.
패턴은 just abc
to just을 포함하는 행을 mno
찾은 다음 { ... }
. 첫 번째 조치는 abc
행을 삭제합니다 . 두 번째 mno
줄; 그리고는 p
나머지 라인을 인쇄합니다. 필요에 따라 정규식을 완화 할 수 있습니다. abc
.. 범위를 벗어난 줄 mno
은 인쇄되지 않습니다.
답변
이것은 당신을 위해 일할 것입니다 (GNU sed) :
sed '/^abc$/,/^mno$/{//!b};d' file
시작 줄 abc
과 줄 사이의 줄을 제외한 모든 줄을 삭제합니다.mno
답변
sed '/^abc$/,/^mno$/!d;//d' file
빈 슬래시 //
는 “마지막으로 사용한 정규식 재사용”을 의미합니다. 그리고 명령은 더 이해하기 쉬운 것과 동일합니다.
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 솔루션은 내 것보다 훨씬 더 / 예쁘다.