[linux] 일치하는 줄 뒤에서 시작하는 파일의 모든 줄을 어떻게 삭제합니까?

여러 줄의 텍스트로 구성된 파일이 있습니다.

The first line
The second line
The third line
The fourth line

줄 중 하나 인 문자열이 있습니다. The second line

파일에서 문자열과 그 뒤의 모든 줄을 삭제하고 싶습니다. 그래서 문자열 The third lineThe fourth line함께 삭제됩니다 . 파일은 다음과 같습니다.

The first line

Google에서 해결책을 찾았는데 sed. 다음과 같은 것 :

sed 'linenum,$d' file

그러나 문자열의 줄 번호를 찾는 방법은 무엇입니까? 아니면 어떻게해야합니까?



답변

일치하는 줄 (또는 다음 줄)을 인쇄하지 않으려면 :

sed -n '/The second line/q;p' inputfile

이것은 “패턴과 일치하는 줄에 도달하면 종료하고 그렇지 않으면 각 줄을 인쇄합니다”라고 말합니다. 이 -n옵션은 암시 적 인쇄를 방지하며 p명령은 명시 적으로 행을 인쇄하는 데 필요합니다.

또는

sed '/The second line/,$d' inputfile

이것은 “일치하는 행에서 시작하여 파일 끝까지 계속되는 출력에서 ​​모든 행을 삭제합니다”라고 말합니다.

하지만 첫 번째는 더 빠릅니다. 그러나 처리가 완전히 종료되므로 인수로 여러 파일이있는 경우 첫 번째 일치 파일 이후의 파일은 처리되지 않습니다. 이 경우 삭제 양식이 더 좋습니다.

일치하는 행을 인쇄하고 싶지만 다음 행은 인쇄하지 않으려는 경우 :

sed '/The second line/q' inputfile

이것은 “모든 행을 인쇄하고 일치하는 행에 도달하면 종료”( -n옵션 (암시 적 인쇄 없음)가 사용되지 않음) 라고 말합니다 .

추가 정보는 man sed 를 참조하십시오 .


답변

이것은 다른 주어진 솔루션보다 약간 짧습니다. 대문자 Q를 사용하여 종료하면 현재 행이 인쇄되지 않습니다.

 sed '/The second line/Q' file

실제로 행을 삭제하려면 동일한 구문을 사용할 수 있습니다.

 sed -i '/The second line/Q' file


답변

sed '/The second line/q0' file

또는 gnu sed없이 :

sed '/The second line/q' file

또는 grep 사용 :

grep -B 9999999 "The second line"


답변

awk 사용 (일치하는 줄을 표시하지 않음)

awk '/pattern/ {exit} {print}' file.txt


답변

먼저 줄 번호를 추가하고 줄을 삭제하십시오.

cat new.txt
The first line
The second line
The third line
The fourth line

 cat new.txt  | nl
     1  The first line
     2  The second line
     3  The third line
     4  The fourth line



cat new.txt  | nl | sed  "/2/d"
     1  The first line
     3  The third line
     4  The fourth line

cat new.txt  |  nl |sed  "3d;4d"
     1  The first line
     2  The second line

awk 사용

awk 'NR!=3 && NR!=4' new.txt
The first line
The second line


답변

awk '/The second line/{exit}1' file


답변