파일에서 하나 이상의 특정 줄 번호를 삭제하고 싶습니다. sed를 사용하여 어떻게합니까?
파일에서 하나 이상의 특정 줄 번호를 삭제하고 싶습니다. sed를 사용하여 어떻게합니까?
답변:
5-10 및 12 행을 삭제하려면 다음을 수행하십시오.
sed -e '5,10d;12d' file
결과가 화면에 인쇄됩니다. 결과를 동일한 파일에 저장하려면 다음을 수행하십시오.
sed -i.bak -e '5,10d;12d' file
파일을까지 백업 file.bak
하고 지정된 줄을 삭제합니다.
참고 : 줄 번호는 1부터 시작합니다. 파일의 첫 줄은 0이 아니라 1입니다.
sed -e '5,$d' file
sed -e '5d' file
. 구문은 다음과 같습니다 <address><command>
. where <address>
는 한 줄과 같 5
거나 같은 줄 범위 5,10
일 수 있으며 명령 d
은 주어진 줄을 삭제합니다. 주소는 정규식이거나 $
파일의 마지막 행을 나타내는 달러 기호 일 수도 있습니다 .
행 번호를 사용하여 특정 단일 행을 삭제할 수 있습니다
sed -i '33d' file
이렇게하면 33 행 번호의 행이 삭제되고 업데이트 된 파일이 저장됩니다.
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
. 감사!
그리고 awk도
awk 'NR!~/^(5|10|25)$/' file
이것은 종종 반 패턴의 증상입니다. 라인 번호를 생성 한 공구는 라인을 즉시 삭제하는 공구로 대체 될 수 있습니다. 예를 들어;
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
앞에 추가 할 수 있습니다.-f
sed
표준 출력에서 결과를 생성하는 대신 대상 파일을 제자리에서 편집 . * BSDish 플랫폼 (OSX 포함)에서는 명시 적 인수도 제공해야합니다 -i
. 일반적인 관용구는 빈 논쟁을 제공하는 것입니다. -i ''
.
p
대신 d
옵션과 함께, -n
(이없이 작동하지 않습니다 -n
, 그리고 !d
중 하나가 작동하지 않습니다).
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 에 현재 블록 안의 줄 번호를 씁니다 . (아래 참조)||
그리고 &&
상기 논리 연산자이다 OR 및 AND .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 |
+-----+------+----------+------------+