블록을 찾는 방법은 무엇입니까? 아니면 awk/ack를 사용해야 합니까?

블록을 찾는 방법은 무엇입니까? 아니면 awk/ack를 사용해야 합니까?

다음 정보가 포함된 파일이 있다고 가정해 보겠습니다.

...
Entry '234238': some text
  some text
  some text
  some text
Entry '899823': some text
  some text
  some text
Entry '234238': more text
  more text
  more text
Entry '645353': some text
  some text
  some text

특정 을 추출하고 싶습니다 Entry '<code>'. 예를 들어 grep_my_block 'Entry '234238'다음과 같이 반환되어야 합니다.

Entry '234238': some text
  some text
  some text
  some text
Entry '234238': more text
  more text
  more text

알아채다:

  1. 식별자 블록은 <code>파일에 여러 번 나타날 수 있습니다. 우리는 그러한 블록을 모두 추출하고 싶습니다.
  2. 블록은 알 수 없는 수의 라인으로 구성될 수 있습니다.

어떻게 사용하거나 grep이를 awk수행할 수 있습니까 ack?

답변1

awk "/^Entry '234238'/ {printline = 1; print; next}
     /^Entry / {printline = 0}
     printline"

답변2

ENTRY="'234238'"
sed -n ':s;/Entry '"$ENTRY"'/{:l;p;n;/^Entry/bs;bl;}' <<\ENTRY
    Entry '234238': some text
        some text
        some text
        some text
    Entry '899823': some text
        some text
        some text
    Entry '234238': more text
        more text
        more text
    Entry '645353': some text
        some text
        some text
#END
ENTRY

산출

Entry '234238': some text
    some text
    some text
    some text
Entry '234238': more text
    more text
    more text

이것은 것보다 낫습니다awk(제 생각에는)왜냐하면sed's스트림 작업.

그것은 내가 해본 일 중 가장 덜 복잡한 일 중 하나입니다. 일단 마음먹고 나면 말이죠. 이것은 GNU 확장 정규식 없이 성공적으로 완료한 첫 번째 작업입니다. 이는 이식성이 매우 뛰어납니다.

이 분기는 두 번 발생합니다. 앵커 포인트가 있습니다.:s시작점과 기준점에서:l첨자입니다. 그것은 작동하기 때문에n연산자는 이전 행을 삭제합니다sed's패턴 공간새로운 것을 가져올 때.

한 번sed당신의 찾기"$ENTRY"그것은 설정한다지점 :l아벨,라인을 인쇄하고 새 라인을 가져옵니다. 그 다음에sed새 줄이 문구로 시작하는지 확인'Entry'이 경우 다시 분기됩니다.:s태그를 지정하고 해당 입력을 다시 스캔하기 시작합니다."$ENTRY,"그렇지 않으면 다음으로 분기됩니다.:l아벨그리고 반복하다p린트, n내선/check/작업.

명령은 다음과 같이 요약됩니다.

until end of file do
    if current line contains "Entry $ENTRY" do
        until next line contains 'Entry' do
            print line
            delete line 
            next line
        done
    done
done

답변3

다음을 사용할 수도 있습니다 pcregrep.

pcregrep -M '234238.*(\n((?!Entry).)*)*' inputfile

그러면 단어가 포함된 줄에서 시작하여 234238단어가 포함된 줄을 만날 때까지 모든 줄이 생성됩니다 Entry.

예제 입력의 경우 다음이 생성됩니다.

Entry '234238': some text
  some text
  some text
  some text
Entry '234238': more text
  more text
  more text

답변4

awk질문이 행 중심이므로 사용하기에 좋은 도구일 수 있습니다.

중복되는 코드가 적은 @HaukeLaging 솔루션의 변형을 사용하겠습니다. 로 시작하는 모든 줄은 Entry플래그를 지우지만, 원하는 특정 항목의 헤더에는 해당 플래그가 설정됩니다. 이 플래그가 설정되면 행을 인쇄하는 기본 조치가 수행됩니다.

awk "/^Entry /         { printline=0; }
     /^Entry '234238'/ { printline=1; }
     printline"

관련 정보