sed를 사용하여 파일에서 한 줄 추출

sed를 사용하여 파일에서 한 줄 추출

sed"start"에 대한 입력 파일을 검색하고 "next"가 포함된 줄을 찾아 다음 줄을 표시하는 스크립트를 어떻게 작성할 수 있습니까 ? 이 같은:

[user]$ cat test.txt
start
next
This line should print
Ignore this


[user]$ display.sed test.txt
This line should print

[user]$ cat test1.txt
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too
start
Ignore this too

[user]$ display.sed test1.txt
This line should print

답변1

범위(처음 발생부터 start파일 끝까지)를 사용하고 d해당 범위 내에서 일치하지 않는 모든 줄을 삭제할 수 있습니다 next. 줄이 일치하면 n다음 줄을 읽고 p인쇄한 후 q다음을 입력하세요.

sed -n '/start/,${
/next/!d;n;p;q
}' infile

당신이 정말로 원하는 것은 다음을 포함하는 파일이라고 생각합니다 display.sed.

#!/bin/sed -nf

/start/,${
/next/!d;n;p;q
}

답변2

사용awkGNU가 아닌 환경에서도 작동하므로 이 경우에 더 적합합니다.구현:

awk '/^start/{ f=1 }f && /^next/ && getline nl>0{ print nl; exit }' test.txt
  • /^start/{ f=1 }f=1- 마주친 라인에 활성 플래그를 설정합니다.start

  • f && /^next/ && getline nl>0- next행이 발견될 때(이전 start행과 일치 - 활성 플래그로 보장 f) - 다음 필수 행이 존재하는지 확인getline nl>0

  • nl("needed line") - 이 줄 다음 줄을 포함합니다.next


출력(현재 입력용):

This line should print

답변3

무엇에 대해 grep? 이 명령이 실제로 원하는 것인지 설명을 추가하겠습니다.

grep -Pzo '(?s)start.*?next\n\K.*?\n' input.txt

입력(두 가지 예 결합)

start
next
This line should print
Ignore this
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too 
start
Ignore this too 

산출

This line should print
This line should print

관련 정보