Unix에서는 패턴을 감지할 때 그에 상응하는 다른 패턴도 감지해야 합니다.

Unix에서는 패턴을 감지할 때 그에 상응하는 다른 패턴도 감지해야 합니다.

패턴이 포함된 라인이 감지된 경우, 다른 패턴을 포함하는 해당 라인을 감지해야 합니다.===이는 아래와 같이 더 높은 라인에서만 발생합니다.

  • 문서 내용:

=== test1.log


게임
=== 파일23.txt
밤 78
멀리

텍스트
=== log3.c
AAA
제한
저녁 3

  • 산출:

    === 파일23.txt
    밤 78

    === log3.c
    저녁 3

답변1

다음과 같이 awk를 사용하여 이를 수행할 수 있습니다.

 awk '/===/ {SEC=$0;PRINTED=0} /night/ {if(!PRINTED) print SEC; print $0; PRINTED=1;}' <file>

라인을 찾아 ===저장하고 아직 라인을 인쇄하지 않았음을 확인합니다. 그런 다음 패턴을 찾으면 night섹션 헤더가 인쇄되었는지 확인하고, 그렇지 않으면 인쇄한 다음 현재 줄을 인쇄하고 섹션 헤더가 인쇄되었음을 표시합니다.

답변2

sed로 이것을 시도했습니다.

sed -n '/===/{
h
d
}
/night/{
G
s/\(.*\)\n\(.*\)/\2\
\1/p
}' inputFile

이것은 정확히 당신이 원하는 것은 아니지만 매우 유사합니다.

=== file23.txt
night78
=== file23.txt
night
=== log3.c
night3
  • /==현재 모드를 버퍼에 저장
  • /night토큰 밤을 포함하는 모든 줄과 일치합니다.
  • G현재 버퍼를 현재 패턴 공간에 추가합니다.
  • /s현재 패턴 문자열과 현재 버퍼 문자열의 위치를 ​​바꿉니다.

관련 정보