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
사용awk
GNU가 아닌 환경에서도 작동하므로 이 경우에 더 적합합니다.앗구현:
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