일치하는 모든 줄과 들여쓰기되지 않은 이전 줄을 인쇄합니다.

일치하는 모든 줄과 들여쓰기되지 않은 이전 줄을 인쇄합니다.

예를 들어, 텍스트에 "일치"가 있는 모든 줄과 이전에 들여쓰기되지 않은 줄을 찾고 싶다고 가정해 보겠습니다.

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)'

...귀하의 예와 같은 결과를 얻으세요...

관련 정보