sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' 단락을 인쇄하는 방법 [중복]

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' 단락을 인쇄하는 방법 [중복]

다음 sed 명령이 단락을 인쇄하는 방법을 설명할 수 있는 사람이 있습니까?

주문하다:

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file

가능하다면 누구나 이 명령을 여러 부분으로 나누어 설명하여 다양한 조건에 따라 명령을 수정하는 방법을 완전히 이해할 수 있습니다.

답변1

주문하다

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file

문자열이 포함된 단락을 인쇄합니다 AAA.

sed이는 다음 스크립트를 사용하여 호출됩니다 sed.

/./{
    H
    $!d
}
x
/AAA/!d

주석이 달린 버전:

/./{        # When hitting a line that contains at least one character...
    H;      # Append the line to the "hold space".
    $!d;    # If it's not the last line, delete it.
}
x;          # Swap the hold space and the pattern space.
/AAA/!d;    # Delete the pattern space if it does not contain the string "AAA"
            # (implicit print)

즉, "예약된 공간"(일반 버퍼 입력)에서 한 줄씩 수집하고 sed빈 줄(패턴 불일치)을 찾으면 /./저장된 줄 집합에 해당 문자열이 포함되어 있는지 확인 AAA하고 인쇄합니다(있는 경우). 하나).

이는 여기 답변에도 설명되어 있습니다.GREP/SED 또는 AWK: 패턴 일치를 기반으로 파일의 전체 단락을 인쇄합니다.

주어진 파일

this is
a paragraph

this is
another one

this paragraph
contains the string
AAA

마지막 단락(앞에 빈 줄 포함)이 출력됩니다.

각 출력 단락 앞의 빈 줄을 제거하려면(원하는 경우) 다음을 사용하십시오.

/./{
    H
    $!d
}
x
/AAA/!d
s/\n//

또는 명령줄에서

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;s/\n//'

관련 정보