한 줄에서 문자열이 처음 나타난 이후의 모든 줄을 삭제합니다.

한 줄에서 문자열이 처음 나타난 이후의 모든 줄을 삭제합니다.

test.txt다음 예와 같이 큰 파일이 있습니다 .

foo
before ...
before some line 
foo something interesting bar
after some lines
after ...
bar

something interestingsed문자열 ""이 처음으로 나타나기 전의 줄만 포함하는 또는 같은 기본 bash 명령을 사용하여 새 파일을 어떻게 생성합니까 ? grep(아니요 awk, awk가 없는 내장 장치에서 이 명령을 사용해야 합니다.)

답변1

sed '/something interesting/,$d' < file > newfile

다음과 같이 최적화할 수 있습니다.

sed -n '/something interesting/q;p' < file > newfile

sed패턴을 찾으면 바로 종료하세요.

sed@RakeshSharma가 지적했듯이 GNU를 사용하면 구현을 다음과 같이 단순화할 수 있습니다.

sed '/something interesting/Q' < file > newfile

ksh93대신 을 사용하여 파일을 자르려면 bash다음을 수행할 수 있습니다.

printf '' <>; file >#'*something interesting*'
  • <>;표준 <>리디렉션 연산자(읽기+쓰기용으로 열기)와 유사하지만 명령이 성공하면 파일의 끝 부분이 잘립니다.
  • <#pattern패턴과 일치하는 다음 줄의 시작 부분을 찾습니다.

(stdout(적어도 ksh93u+에서는)에서는 작동하는 것 같지만 , 또는 printf ''와 같은 다른 내장 명령에서는 작동하지 않는다는 점 에 유의하십시오 .true:eval실수. 그리고 스크립트의 마지막 명령이 될 수 없습니다(또 다른 오류)).

관련 정보