sed를 사용하여 텍스트 파일에서 특정 줄 번호를 삭제 하시겠습니까?


235

파일에서 하나 이상의 특정 줄 번호를 삭제하고 싶습니다. sed를 사용하여 어떻게합니까?


1
당신이 원하는 것에 대한 더 구체적인 예를 들어 줄 수 있습니까? 어떤 줄을 제거할지 어떻게 결정할 것입니까?
Mark Byers

아마도 stackoverflow.com/questions/13272717/…을 참조 하고 반대로 적용하십시오 (키가 연관 배열에 없으면 인쇄하십시오).
tripleee

답변:


374

5-10 및 12 행을 삭제하려면 다음을 수행하십시오.

sed -e '5,10d;12d' file

결과가 화면에 인쇄됩니다. 결과를 동일한 파일에 저장하려면 다음을 수행하십시오.

sed -i.bak -e '5,10d;12d' file

파일을까지 백업 file.bak하고 지정된 줄을 삭제합니다.

참고 : 줄 번호는 1부터 시작합니다. 파일의 첫 줄은 0이 아니라 1입니다.


32
모든 유닉스에 "-i"가 포함 된 것은 아닙니다. "sed cmd file> file"로 돌아가 실수로 파일을 지우지 마십시오.
pra

4
마지막 줄까지 5 번째 줄을 삭제하려면 어떻게해야합니까?
Jürgen Paul

14
@WearetheWorldsed -e '5,$d' file
브라이언 캠벨

1
@BrianCampbell 특정 줄만 삭제하려면 어떻게해야합니까 ??
Kanagavelu Sugumar

14
@KanagaveluSugumar sed -e '5d' file. 구문은 다음과 같습니다 <address><command>. where <address>는 한 줄과 같 5거나 같은 줄 범위 5,10일 수 있으며 명령 d은 주어진 줄을 삭제합니다. 주소는 정규식이거나 $파일의 마지막 행을 나타내는 달러 기호 일 수도 있습니다 .
Brian Campbell

50

행 번호를 사용하여 특정 단일 행을 삭제할 수 있습니다

sed -i '33d' file

이렇게하면 33 행 번호의 행이 삭제되고 업데이트 된 파일이 저장됩니다.


1
제 경우에는 "sed"가 잘못된 줄을 제거했습니다. 그래서 나는이 접근법을 사용합니다 : sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'. 감사!
Eduardo Lucio

여기에서 루프를 작성하고 이상하게도 일부 파일이 올바른 줄을 잃어 버렸지 만 일부 파일은 다른 줄도 잃어 버렸습니다. (GNU / 리눅스 bash4.2) 루프에서 일을 잘 아래 awk 명령
FatihSarigol

행 목록에서 삭제하는 경우 sort -r을 사용하도록주의하십시오. 그렇지 않으면 첫 번째 sed가 다른 모든 행 번호를 변경합니다!
Konchog

잘못 라인에 대한 의견이 루프에서 삭제되기 : 반드시 그렇지 않으면 삭제 된 각 라인은 라인 번호를 상쇄 할 가장 큰 행 번호로 시작하는 ...
스키 피 르 그랜드 Gourou

25

그리고 awk도

awk 'NR!~/^(5|10|25)$/' file

2
NB :이 awk 라인은 sed 변형 (OS-X와 Ubuntu Linux 간)보다 안정적으로 작동했습니다.
Jay Taylor

3
파일의 내용은 삭제되지 않습니다. 이 줄없이 파일을 stdout에 인쇄합니다. 따라서 출력을 임시 파일로 리디렉션 한 다음 임시 파일을 이동하여 원본을 바꾸어야합니다.
mivk


6

이것은 종종 반 패턴의 증상입니다. 라인 번호를 생성 한 공구는 라인을 즉시 삭제하는 공구로 대체 될 수 있습니다. 예를 들어;

grep -nh error logfile | cut -d: -f1 | deletelines logfile

( deletelines필요한 유틸리티는 어디에 있습니까? )는 다음과 같습니다.

grep -v error logfile

실제로이 작업을 수행해야하는 상황이라면 sed줄 번호 파일에서 간단한 스크립트를 생성 할 수 있습니다 . 유머러스하지만 (어쩌면 약간 혼란 스럽습니다) 당신은 이것을 할 수 있습니다 sed.

sed 's%$%d%' linenumbers

이것은 줄 번호 파일을 한 줄에 하나씩 받아들이며 표준 출력에서 d각 줄 뒤에 붙은 동일한 줄 번호를 생성 합니다. 이것은 유효한 sed스크립트입니다. 파일로 저장하거나 (일부 플랫폼에서는) 다른 sed인스턴스로 파이프 할 수 있습니다 .

sed 's%$%d%' linenumbers | sed -f - logfile

일부 플랫폼에서는 표준 입력을 의미 sed -f하는 옵션 인수 -를 이해하지 못 하므로 스크립트를 임시 파일로 리디렉션하고 완료되면 정리하거나 고독 대시를 /dev/stdin또는/proc/$pid/fd/1 당신의 OS (또는 쉘 경우 )가 있습니다.

항상 그렇듯이 옵션 -i앞에 추가 할 수 있습니다.-fsed 표준 출력에서 ​​결과를 생성하는 대신 대상 파일을 제자리에서 편집 . * BSDish 플랫폼 (OSX 포함)에서는 명시 적 인수도 제공해야합니다 -i. 일반적인 관용구는 빈 논쟁을 제공하는 것입니다. -i ''.


나는 "반 패턴의 증상"에 동의하지 않습니다. 마크 업 기반 파일 형식 (예 : XML 또는 JSON)은 유효한 파일이 되려면 끝에 특정 줄이 필요합니다. 이 경우 해당 행을 제거하고 추가 할 항목을 파일에 넣은 다음 해당 행을 다시 추가하는 것이 가장 합리적인 방법 인 경우가 종종 있습니다. sed와 같은 추가 도구를 최대한 사용하지 않으려는 잠재적 욕구.
Egor Hans

어떤 시나리오를 상상하고 있는지 잘 모르겠습니다. 가 있습니다 이 합법적 인 방법 그러나 내가 본 대부분의 경우이다 시나리오는 더 많거나 적은 바로 내 첫 번째 예는 보여줍니다 무엇 초보자가된다. (아마도 그들은 실제로 저수준 언어에서 왔으며 asm 또는 C로해야하기 때문에 문제를 분자 수준을 넘어서 나누는 데 사용됩니다.)
tripleee

XML 또는 JSON에서 줄 번호에 의해 물건을 제거하면 소리 extermely 취성이 아니라면 크게 위험합니다.
tripleee

내가 기본적으로 의미하는 것은 그러한 파일을 만든 사람으로서 문서의 마지막에 있어야 할 것을 알고 있다는 것입니다 (즉, JSON의 마지막 몇 줄에 닫는 중괄호 / 대괄호 세트 또는 정확한 XML의 닫는 태그). 이를 알고, 그러한 문서를 확장하는 가장 간단한 방법은 1) 마지막 몇 줄을 제거하고, 2) 새 내용을 추가하고, 3) 마지막 몇 줄을 다시 추가하는 것입니다. 이런 식으로 문서는 문서 중간에 줄을 추가하는 방법을 찾을 필요없이 확장 전후에 유효 할 수 있습니다.
Egor Hans

1
지금까지 이것은 많은 행에 적합한 솔루션을 갖춘 유일한 해결책입니다 (예 : 파일에서 제공). 그리고 머리말도 의미가 있습니다. 더 많은 투표를받을 가치가 있습니다. 당신이하려는 경우 BTW, 인쇄 를 행을 삭제하는 대신, 사용하는 p대신 d옵션과 함께, -n(이없이 작동하지 않습니다 -n, 그리고 !d중 하나가 작동하지 않습니다).
Skippy le Grand Gourou

2

awk로 일반화를 제안하고 싶습니다.

파일이 고정 된 크기의 블록으로 만들어지고 삭제할 행이 각 블록에 대해 반복되면 awk는 그런 방식으로 잘 작동 할 수 있습니다

awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print  $0}'
 OriginFile.dat > MyOutputCuttedFile.dat

이 예에서 블록의 크기는 2000이며 [1..713] 및 [1026..1029] 줄을 인쇄하고 싶습니다.

  • NR awk가 현재 행 번호를 저장하는 데 사용하는 변수입니다.
  • % 두 정수의 나눗셈의 나머지 (또는 모듈러스)를 제공합니다.
  • nl=((NR-1)%BLOCKSIZE)+1여기서 우리는 변수 nl 에 현재 블록 안의 줄 번호를 씁니다 . (아래 참조)
  • ||그리고 &&상기 논리 연산자이다 ORAND .
  • print $0 전체 줄을 쓴다

Why ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
  +1   We add again 1 because we want to restore the desired order.

+-----+------+----------+------------+
| NR  | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
|  1  |  1   |    0     |     1      |
|  2  |  2   |    1     |     2      |
|  3  |  0   |    2     |     3      |
|  4  |  1   |    0     |     1      |
+-----+------+----------+------------+


2
나는 당신이 당신의 광기를 유발하는 이름에 따라 사는 방식에 감탄합니다.
Jukka Dahlbom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.