예를 들어, 텍스트에 "일치"가 있는 모든 줄과 이전에 들여쓰기되지 않은 줄을 찾고 싶다고 가정해 보겠습니다.
Container 1
some text
some text
matching text
some text
Container 2
some text
some text
Container 3
some text
matching text
내가 원하는 결과는 다음과 같습니다
Container 1
matching text
Container 3
matching text
가능합니까?
답변1
한 가지 방법은 다음과 같습니다 sed
.
sed -n '/^[^[:blank:]]/b do # if line is not indented go to label do
//!{ # if line is indented and if it
/matching/H # matches, append it to hold space
}
$b do # if on last line go to label do
b # branch to end of script
: do # label do
x # exchange hold buffer w. pattern space
/\n.*matching/p # if current pattern space matches, print
' infile
들여쓰기되지 않은 일치하는 줄도 인쇄하려는 경우(예: Container matching stuff
다음 들여쓰기 블록에 일치하는 줄이 없더라도) 마지막 조건을 변경하여 제한을 /matching/p
제거 \n.*
하고 한 줄만 남아 있어도 패턴 공간을 인쇄합니다(들여쓰기 없음). ) 일치:
sed -n '/^[^[:blank:]]/b do
//!{
/matching/H
}
$b do
b
: do
x
/matching/p
' infile
답변2
awk '
!/^[[:blank:]]/ {unindented = $0}
/matching/ && /^[[:blank:]]/ {print unindented; print}
' file
공백으로 시작하지 않는 마지막 줄을 기억합니다. 이 값은 일치하는 행에 도달할 때 사용됩니다.
답변3
여기 또 다른 것이 있습니다 sed
:
sed -ne'/^[[:space:]]/H;$x;//!{$!x;//!s/\n.*match/&/p;}' <in >out
Container 1
some text
some text
matching text
some text
Container 3
some text
matching text
그것은 다음을 고려한다컨테이너공백이 아닌 연속된 줄이며 공백이 아닌 문자로 시작하고 인쇄만 합니다.컨테이너어느 것이 일치하는가성냥두 번째 줄부터 한 번 이상.
다음과 같이 작성할 수 있습니다 grep
.
sed ... | grep -E '^([^ ]| .*match)'
...귀하의 예와 같은 결과를 얻으세요...