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


84

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

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

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


귀하의 문제 진술은 모순됩니다. 'I want to delete all lines after the line'은 두 줄만 삭제한다는 의미이지만 (말한대로) 예제 출력에는 매치 라인도 누락 된 것으로 표시됩니다. 실제로 원하는 것은 무엇입니까?
Jonathan Leffler 2011 년

일치하는 줄과 그 뒤의 모든 줄. 영어 실력을 향상시켜야합니다. 귀하의 정보에 감사드립니다.
DocWiki 2011 년

답변:


136

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

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 를 참조하십시오 .


3
그러나 일부 명령은 깨진 파이프 ( co -p예 : RCS) 에 대해 불안해 하며 sed '/The second line/,$d'표기법을 사용하는 것이 좋습니다 .
Jonathan Leffler 2011 년

설명을 추가해 주시겠습니까?
Ahmad Abdelghany

@AhmadAbdelghany : 설명이 추가되었습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

@DennisWilliamson 감사합니다.
아마드 Abdelghany

첫 번째 방법은 일치하는 줄 앞의 마지막 줄을 두 번 인쇄합니다. 작업 p후 삭제 ;.
CrazyFrog

27

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

 sed '/The second line/Q' file

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

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

1
이것은 내가 가장 좋아하는 솔루션입니다.
TryTryAgain

5
sed '/The second line/q0' file

또는 gnu sed없이 :

sed '/The second line/q' file

또는 grep 사용 :

grep -B 9999999 "The second line"

고마워요! 아직 모르는 특정 문자열의 줄 번호를 찾는 방법을 알려주세요.
DocWiki 2011 년

grep -n "두 번째 줄"파일 | AWK -F는 '{$ 1 인쇄}'
에릭

@DocWiki : 줄 번호가 필요하지 않습니다. 당신은 그것을 검색합니다. sed "/$string/,\$d" inputfile.
Jonathan Leffler 2011 년

5

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

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

두 번째 줄의 값을 모를 수도 있으므로 이것이 가장 좋은 대답입니다.
RonJohn

0

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.