전체 파일 시스템에서 sed 전체 행 삭제?


11

아직 진단되지 않은 응용 프로그램 버그로 인해 전체 디스크가있는 수백 대의 서버가 있습니다. 로그 파일이 아니라 변수 정의가있는 사용자 환경 파일이 중복 된 줄로 채워진 파일이 하나 있습니다 (따라서 파일을 삭제할 수는 없습니다).

sed잘못 추가 된 줄을 확인하고 삭제 하는 간단한 명령을 작성 하여 파일의 로컬 사본에서 테스트했습니다. 의도 한대로 작동했습니다.

그러나 전체 디스크가있는 서버에서 시도했을 때 대략 다음과 같은 오류가 발생했습니다 (복사 및 붙여 넣기가 아닌 메모리에서 발생).

sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname

물론 남은 공간이 없다는 것을 알고 있습니다. 내가 물건을 삭제하려고하는 이유입니다! ( sed내가 사용 하는 명령은 4000 + 줄 파일을 약 90 줄로 줄입니다.)

sed명령은sed -i '/myregex/d' /path/to/file/filename

전체 디스크에도 불구하고이 명령을 적용 할 수있는 방법이 있습니까?

(수백 대의 서버에 빠른 수정으로 적용해야하므로 자동화해야합니다.)

(응용 프로그램 버그를 진단해야하지만 그 동안 서버가 제대로 작동하지 않습니다 ....)


업데이트 : 내가 직면 한 상황은 내가 삭제할 수 있다는 것을 발견하여 해결되었지만 미래와 다른 사람들에게 도움이 될 질문에 대한 답변을 여전히 원합니다 .

/tmp아니고; 동일한 파일 시스템에 있습니다.

디스크 공간을 확보하기 전에 vi파일을 열고 실행 :g/myregex/d하여 변경 내용을 저장하여 줄을 삭제할 수 있음을 테스트하고 확인 했습니다 :wq. 임시 파일을 보유하기 위해 별도의 파일 시스템에 의존하지 않고 이것을 자동화하는 것이 가능해야합니다 .... (?)



1
sed -i작동 할 임시 사본을 작성합니다. ed실제 솔루션을 제공 할만큼 익숙하지는 않지만이 방법이 더 나을 것이라고 생각합니다.
Eric Renouf

2
으로 ed실행할 것 : printf %s\\n g/myregex/d w q | ed -s infile하지만 명심처럼 일부 구현은 임시 파일을 사용 sed(당신이 시도 할 수 비지 박스의 에드 - 그것은 임시 파일을 생성하지 않습니다 AFAIK)
don_crissti

1
@Wildcard-안정적으로 w /하지 않습니다 echo. 사용하십시오 printf. 그리고 수 있도록 sed당신이 후행 공백 손실을 방지 할 수 있도록 마지막 줄에서 드롭 일부 문자를 추가합니다. 또한 쉘은 단일 명령 행으로 전체 파일을 처리 할 수 ​​있어야합니다. 그게 당신의 위험입니다-먼저 테스트하십시오. bash특히 스택 공간이 필요하다고 생각합니까? 언제든지 당신을 아프게 할 수 있습니다. 두 가지 sed권장 사항은 적어도 커널의 파이프 버퍼를 사용하여 그들 사이에 좋은 효과를 주지만 방법은 상당히 유사합니다. filesed w / in의 성공 여부에 따라 명령 하위 항목도 잘립니다 .
mikeserv

1
@Wildcard-시도 sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}하고 작동하면 나머지 답변을 읽으십시오. '
mikeserv

답변:


10

-i옵션은 실제로 원본 파일을 덮어 쓰지 않습니다. 출력으로 새 파일을 만든 다음 파일 이름을 원래 파일 이름으로 바꿉니다. 이 새 파일을위한 파일 시스템 공간이 없기 때문에 실패합니다.

스크립트에서 직접 수행해야하지만 다른 파일 시스템에서 새 파일을 작성하십시오.

또한 정규 표현식과 일치하는 행을 삭제하는 경우 grep대신 대신 사용할 수 있습니다 sed.

grep -v 'myregex' /path/to/filename > /tmp/filename && mv /tmp/filename /path/to/filename

일반적으로 프로그램이 입력 및 출력과 동일한 파일을 사용하는 것은 거의 불가능합니다. 파일에 쓰기를 시작하자마자 파일에서 읽은 프로그램의 일부는 더 이상 원래 내용을 볼 수 없습니다. 따라서 원본 파일을 먼저 어딘가에 복사하거나 새 파일에 쓰고 완료되면 이름을 바꿔야합니다.

임시 파일을 사용하지 않으려면 파일 내용을 메모리에 캐시하십시오.

file=$(< /path/to/filename)
echo "$file" | grep -v 'myregex' > /path/to/filename

1
권한, 소유권 및 타임 스탬프를 유지 했습니까? 어쩌면 rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"에서 여기
Hastur

@Hastur- sed -i그 물건을 보존한다는 것을 의미 합니까?
mikeserv

2
@Hastur sed -i는 그러한 것들을 보존하지 않습니다. 방금 소유하지 않은 파일로 시도했지만 소유 한 디렉토리에 있으며 파일을 바꿀 수 있습니다. 교체는 원래 소유자가 아닌 내가 소유합니다.
Barmar

1
@ RalphRönnquist 확실히하기 위해서는 두 단계를 거쳐야합니다 :var=$(< FILE); echo "$FILE" | grep '^"' > FILE
Barmar

1
@Barmar-작동하지 않습니다-입력을 성공적으로 열 었는지조차 모릅니다. 매우 당신이 할 수있는 최소한입니다 v=$(<file)&& printf %s\\n "$v" >file하지만 당신도 사용하지 않습니다 &&. asker는 스크립트에서 파일을 실행하는 것에 대해 이야기하고 있습니다-파일 자체의 일부로 파일 덮어 쓰기를 자동화합니다. 적어도 입력 및 출력을 열 수 있는지 확인해야합니다. 또한 쉘이 폭발 할 수 있습니다.
mikeserv

4

그것이 sed작동 하는 방식입니다. -i(제자리 편집) 과 함께 사용 sed하면 처리 된 파일의 새 내용으로 임시 파일이 작성됩니다. 완료되면 sed현재 작업 파일을 임시 파일로 바꿉니다. 이 유틸리티는 파일 을 제자리에서 편집하지 않습니다 . 그것은 모든 편집자의 행동입니다.

쉘에서 다음 작업을 수행하는 것과 같습니다.

sed 'whatever' file >tmp_file
mv tmp_file file

이 시점 sed에서 fflush()시스템 호출 을 통해 버퍼링 된 데이터를 오류 메시지에 언급 된 파일로 플러시합니다 .

출력 스트림의 경우, fflush()스트림의 기본 쓰기 기능을 통해 지정된 출력 또는 업데이트 스트림에 대해 모든 사용자 공간 버퍼링 된 데이터를 강제로 기록합니다.


문제의 경우 separte 파일 시스템 (예 : tmpfs메모리가 충분한 경우 또는 외부 저장 장치가있는 경우)을 마운트하고 일부 파일을 이동하고 처리 한 다음 다시 이동 시키는 솔루션 이 있습니다.


3

이 질문을 게시 ex한 후 POSIX 호환 프로그램이라는 것을 알게되었습니다 . 거의 보편적으로 링크되어 vim있지만 다음 중 하나 ex는 POSIX 사양에서 가져온 파일 시스템과 관련하여 핵심 사항 입니다.

이 섹션에서는 편집 버퍼 라는 용어를 사용하여 현재 작업중인 텍스트를 설명합니다. 이 용어는 특정 구현을 암시하지 않습니다. 모든 편집 변경은 편집 버퍼에서 수행되며, 편집기 명령이 파일을 쓸 때까지 파일에 영향을 미치지 않습니다.

"... 모든 파일에 영향을 미칠 것입니다 ..."파일 시스템에 무언가를 넣는 것 (임시 파일조차도)은 "모든 파일에 영향을 미치는"것으로 간주합니다. 아마도?*

POSIX 사양에 대한ex 신중한 연구는 ex온라인 에서 찾은 일반적인 스크립트 사용 ( vim특정 명령 으로 흩어져 있음)과 비교할 때 의도 된 휴대용 사용에 대한 일부 "gotchas" 나타냅니다 .

  1. +cmdPOSIX에 따라 구현 은 선택 사항입니다.
  2. 여러 -c옵션을 허용하는 것도 선택 사항입니다.
  3. 전역 명령 :g은 이스케이프되지 않은 다음 줄 바꿈까지 모든 것을 "먹습니다"(따라서 정규 표현식에서 찾은 각 일치 후에 끝에서 한 번 실행되지 않고 실행). 따라서 하나의 인스턴스 -c 'g/regex/d | x'만 삭제 다음 파일을 종료합니다.

내가 연구 한 바에 따르면 , 특정 정규 표현식과 일치하는 모든 줄을 삭제하기 위해 전체 파일 시스템에서 파일을 편집하는 POSIX 호환 방법은 다음과 같습니다.

ex -sc 'g/myregex/d
x' /path/to/file/filename

이것은 파일을 버퍼에로드하기에 충분한 메모리가 있으면 작동합니다.

* 다른 표시가 있으면 의견에 기재하십시오.


2
그러나 ex는 tmpfile에 씁니다 ... 항상. 버퍼는 정기적으로 디스크에 버퍼를 쓰도록 지정했습니다. 디스크에서 tmp 파일 버퍼를 찾기위한 지정된 명령도 있습니다.
mikeserv

@Wildcard 공유해 주셔서 감사합니다 . SO의 비슷한 게시물로 다시 연결되었습니다 . ex +g/match/d -scx filePOSIX를 준수 한다고 가정 합니까?
kenorb

사양을 읽은 결과에 따르면 @kenorb는 그렇지 않습니다. 위의 답변에서 내 요점 1을 참조하십시오. POSIX의 정확한 인용문은 "ex 유틸리티는 지정되지 않은 '-'사용법을 제외하고 XBD 유틸리티 구문 지침을 준수해야하며 '+' 옵션 구분 기호 및 '-' 로 인식 될 수 있습니다 ."
와일드 카드

1
상식에 대한 호소를 제외하고는 그것을 증명할 수 없지만, 당신은 실제로 거기보다 사양에서 그 진술을 더 많이 읽고 있다고 생각합니다. 보다 안전한 해석은 편집 버퍼를 변경해도 편집 세션이 시작되기 전에 존재했거나 사용자가 지정한 파일에 영향을 미치지 않아야한다는 것입니다. 내 답변에 대한 의견도 참조하십시오.
G-Man, 'Reinstate

@ G-Man, 사실 당신이 옳다고 생각합니다. 나의 초기 해석은 아마도 희망적인 생각이었다. 그러나 파일을 편집하는 것은 전체 파일 시스템 에서 vi 작동 했기 때문에 대부분의 경우 ex잘 작동 한다고 생각 하지만 엄청난 파일에는 적합하지 않습니다. sed -i파일 크기에 관계없이 전체 파일 시스템에서 작동하지 않습니다.
와일드 카드

2

파이프를 사용하십시오, 루크!

파일 읽기 | 필터 | 다시 쓰기

sed 's/PATTERN//' BIGFILE | dd of=BIGFILE conv=notrunc

이 경우 sed새 파일을 만들지 않고 동일한 파일dd 을 여는 출력 파이프를 보냅니다 . 물론 하나의 경우에 사용할 수 있습니다grep

grep -v 'PATTERN' BIGFILE | dd of=BIGFILE conv=notrunc

그런 다음 나머지 를 자릅니다 .

dd if=/dev/null of=BIGFILE seek=1 bs=BYTES_OF_SED_OUTPUT

1
질문 의 "전체 파일 시스템" 부분을 보셨습니까 ?
와일드 카드

1
@Wildcard, sed항상 임시 파일을 사용합니까? grep어쨌든하지 않습니다
Leben Gleben

이것은 sponge명령 의 대안으로 보입니다 . 예, sed함께 -i항상 000 권한을 가진 "seduyUdmw"lilke 파일을 만듭니다.
Pablo A

1

다른 답변에서 언급했듯이 sed -i파일을 동일한 디렉토리 의 새 파일로 복사 하고 프로세스를 변경 한 다음 새 파일을 원본 위로 이동하여 작동합니다. 그것이 작동하지 않는 이유입니다.  ed(원래 줄 편집기)는 다소 비슷한 방식으로 작동하지만 마지막으로 확인했을 /tmp때 스크래치 파일에 사용 됩니다. 귀하의 경우 /tmp전체의 것과 다른 파일 시스템에, ed당신을 위해 일을 할 수 있습니다.

대화식 쉘 프롬프트에서 다음을 시도하십시오.

$ ed / path / to / file / filename
피
g / myregex / d
승
큐

P(A 인 자본 P)가 엄격하게 필요하지 않습니다. 프롬프트를 켭니다. 그것 없이는, 당신은 어둠 속에서 일하고 있으며, 어떤 사람들은이 당혹감을 느낍니다. w하고 q있습니다 의식 및 Q UIT.

ed암호 진단으로 악명이 높습니다. 어떤 점에서 그것은 (어떤 프롬프트 것이 다른 것을 표시하면 *분명 성공적인 운영 (의 확인입니다) 또는 뭔가 특히 그것이 포함되어있는 경우 ?) 하지 않는다 (사용하여 파일을 쓰기 w). 그냥 종료하십시오 ( q). 그것이 당신을 풀어주지 않으면 q다시 말 하십시오.

귀하의 경우 /tmp디렉토리가 가득 파일 시스템에 (의 파일 시스템은 또한, 전체 경우 또는) 일부 공간 어딘가를 찾아보십시오. tmpfs 또는 외부 저장 장치 (예 : 플래시 드라이브) 장착에 대한 혼돈; 그러나 여러 파일 시스템이 있고 파일 시스템이 모두 가득 차지 않은 경우 다른 기존 파일 시스템 중 하나를 사용할 수 있습니다. 혼돈은 파일을 다른 파일 시스템으로 복사하고 파일을 편집 한 다음 ( sed) 다시 복사 할 것을 제안합니다. 이 시점에서 가장 간단한 솔루션 일 수 있습니다. 그러나 여유 ​​공간이있는 파일 시스템에 쓰기 가능한 디렉토리를 만들고 환경 변수 TMPDIR를 해당 디렉토리를 가리 키도록 설정 한 다음 실행하는 방법이 ed있습니다. (공개 : 이것이 효과가 있는지 확실하지 않지만 상처를 입을 수는 없습니다.)

작업을 마치면 다음 ed을 수행하여이를 자동화 할 수 있습니다.

ed filename << EOF
g / myregex / d
승
큐
EOF

스크립트에서. 또는 don_crissti가 제안한대로.printf '%s\n' 'g/myregex/d' w q | ed -s filename


흠. 같은 일이 (와 중 수행 할 수 있습니다 ed또는 함께 ex하도록) 메모리가 별도의 파일 시스템이 아니라 사용됩니까? 그게 내가 실제로했던 것 (그리고 내가 대답을 받아들이지 않은 이유)
Wildcard

흠. 이것은 내가 깨달은 것보다 더 복잡 할 수 있습니다. 나는 ed수년 전에 광범위하게 소스를 연구했습니다 . 프로세스가 64K (!) 주소 공간으로 제한되는 16 비트 컴퓨터와 같은 것들이 여전히 있었기 때문에 편집기에서 전체 파일을 메모리로 읽는 편집기의 아이디어는 스타터가 아닙니다. 그 이후로 메모리는 커졌지 만 디스크와 파일도 커졌습니다. 디스크가 너무 커서 사람들 /tmp은 공간이 부족한 상황에 대처할 필요가 없습니다 . 방금 최근 버전의 소스 코드를 간단히 살펴 ed보았지만 여전히 ... (계속)
G-Man은 'Reinstate Monica'라고

(계속)…“편집 버퍼”를 임시 파일로 무조건적으로 구현하기 위해 – 그리고 ed(또는 ex또는 vi) 버전 이 버퍼를 메모리에 유지하는 옵션을 제공 한다는 표시를 찾을 수 없습니다 .  반면, ed 및 vi를 사용한 텍스트 편집 – 11 장 : 텍스트 처리 – 2 부 : Red Hat Linux 살펴보기 – Red Hat Linux 9 전문가 비밀 – Linux 시스템ed편집 버퍼가 메모리에 상주 한다고 말합니다. )
G-Man은 '복원 모니카'

(계속)… Balasubramaniam Srinivasan의 UNIX 문서 처리 및 조판vi(와 동일한 프로그램 ex)에 대해 같은 내용을 말합니다 . 나는 그들이 조잡하고 부정확 한 표현을 사용하고 있다고 믿습니다. 그러나 그것이 인터넷에 있거나 (또는 ​​인쇄 된) 사실이라면 맞습니까? 당신은 당신의 돈을 지불하고 선택을합니다.
G-Man, 'Reinstate

그러나 어쨌든, 나는 새로운 대답을 추가했습니다.
G-Man, 'Reinstate

1

바이트 수를 오프셋으로 가져올 수 있고 줄이 시작점에서 끝까지 발생하면 파일을 아주 쉽게자를 수 있습니다.

o=$(sed -ne'/regex/q;p' <file|wc -c)
dd if=/dev/null of=file bs="$o" seek=1

또는 ${TMPDIR:-/tmp}다른 파일 시스템에있는 경우 :

{   cut -c2- | sed "$script" >file
} <file <<FILE
$(paste /dev/null -)
FILE

때문에 (대부분의) 쉘은 삭제 된 임시 파일 거기에 자신의 여기-문서를 넣습니다. <<FILE디스크립터가 처음부터 끝까지 유지되고 ${TMPDIR:-/tmp}필요한만큼의 공간 이있는 한 완벽하게 안전 합니다.

임시 파일을 사용하지 않는 쉘은 파이프를 사용하므로 이런 방식으로 사용하는 것은 안전하지 않습니다. 이 포탄은 전형적으로 ash같은 파생 상품 busybox, dash, BSD sh- zsh, bash, ksh, 및 Bourne 쉘 그러나, 모든 사용 임시 파일.

분명히 나는 지난 7 월에 이와 비슷한 것을하기 위해 작은 쉘 프로그램을 작성했습니다.


/tmp실행 가능하지 않은 경우 파일을 메모리에 넣을 수있는 한 ...

sed 'H;$!d;x' <file | { read v &&
sed "$script" >file;}

... 일반적으로 sed입출력 파일을 자르기 전에 첫 번째 프로세스 에서 파일이 완전히 버퍼링되었는지 확인 하십시오.

보다 목표적이고 효율적인 솔루션은 다음과 같습니다.

sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}

... 어쨌든 삭제하려는 버퍼링 라인을 방해하지 않기 때문입니다.

일반적인 경우의 테스트 :

{   nums=/tmp/nums
    seq 1000000 >$nums
    ls -lh "$nums"
    wc -l  "$nums"
    sed 'H;$!d;x' <$nums | { read script &&  ### read always gets a blank
    sed "$script" >$nums;}
    wc -l  "$nums"
    ls -lh "$nums"
}

-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums
1000000 /tmp/nums
1000000 /tmp/nums
-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums

바이트 수 (각 서버마다 다름) /tmp가 포함되어 있고 동일한 파일 시스템에있는 (나를 위해) 해결할 수없는 솔루션으로 시작하기 때문에 귀하의 답변을 자세히 읽지 않았다고 고백합니다 . 나는 당신의 이중 sed버전을 좋아합니다 . 나는 Barmar와 당신의 대답의 조합이 아마도 가장 좋을 것이라고 생각합니다. myvar="$(sed '/myregex/d' < file)" && [ -n "$myvar" ] && echo "$myvar" > file ; unset myvar (이 경우 나는 후행 줄 바꿈을 유지하는 것에 신경 쓰지 않습니다.)
Wildcard

2
@Wildcard-그럴 수 있습니다. 그러나 셸을 데이터베이스처럼 사용해서는 안됩니다. sed| cat위의 것은 전체 파일을 이미 버퍼링 하지 않고 출력 sed에 모든 파일 쓰기를 시작할 준비가되어 있지 않으면 출력을 열지 않습니다 . 파일 버퍼링을 시도하고 실패하면 첫 번째 줄 바꿈을 읽기 전에 파이프 read에서 EOF를 찾아 메모리에서 완전히 쓸 때까지 절대로 발생 하지 않으므로 성공하지 못합니다 . 오버플로 또는 이와 유사한 것이 실패합니다. 또한 전체 파이프 라인은 매번 성공 또는 실패를 반환합니다. var에 저장하는 것이 더 위험합니다. |cat >out
mikeserv

@Wildcard- 변수에서 실제로 원한다면 id는 다음과 같이 생각합니다. file=$(sed '/regex/!H;$!d;x' <file | read v && tee file) && cmp - file <<<"$file" || shite따라서 출력 파일과 var가 동시에 작성되므로 효과적인 백업을 만들거나 효과적인 백업을 만들 것입니다. 필요한 것보다 더 복잡합니다.
mikeserv

@ mikeserv : 지금 OP와 동일한 문제를 다루고 있으며 솔루션이 실제로 유용하다는 것을 알았습니다. 그러나 귀하의 답변 read script과 사용법을 이해하지 못합니다 read v. 더 자세히 설명해 주시면 감사하겠습니다.
sylye

1
@sylye- 파일의 원하는 부분을 목표 $script로하는 sed스크립트입니다. 스트림에서 원하는 최종 결과를 얻는 스크립트입니다. v빈 줄에 대한 자리 표시 자입니다. A의 bash쉘이 필요하기 때문에하지 않습니다 bash자동으로 사용됩니다 $REPLY하나를 지정 해달라고하면 그 대신에 쉘 변수는하지만, POSIXly 당신은 항상해야한다. 그건 그렇고 유용하다고 생각합니다. 행운을 빕니다. 깊이있는 것이 필요한 경우 im mikeserv @ gmail. 며칠 후에 컴퓨터가 다시 있어야합니다
mikeserv

0

이 답변에서 아이디어를 차용 이 다른 대답이 다른 대답을 하지만, 더 일반적으로 적용 답을 작성,이를 기반으로 :

num_bytes = $ (sed '/ myregex / d' / path / to / file / filename | wc -c)
sed '/ myregex / d' / path / to / file / filename 1 <> / path / to / file / filename 
dd if = / dev / null of = / path / to / file / filename bs = "$ num_bytes"찾기 = 1

첫 번째 행은 sed파일이 아닌 표준 출력에 출력을 기록 하여 명령을 실행합니다 . 특히, wc캐릭터를 세는 파이프에 . 두 번째 줄은 또한 sed표준 출력에 기록 된 출력으로 명령을 실행합니다 .이 경우 여기서는 논의되는 읽기 / 쓰기 덮어 쓰기 (잘라 내기 없음) 모드의 입력 파일로 리디렉션됩니다 . 이것은 다소 위험한 일입니다. 필터 명령 이 데이터 양 (텍스트)을 늘리지 않을 때만 안전합니다 . 즉, 모든에 대한 N , 그것을 읽는 바이트가 기록 N 이하의 바이트. 물론 이것은 sed '/myregex/d'명령에 해당됩니다. 읽는 모든 줄에 대해 정확히 같은 줄을 쓰거나 아무것도 쓰지 않습니다. (다른 예 :s/foo/fu/또는 s/foo/bar/안전 할 것이나, s/fu/foo/그리고 s/foo/foobar/하지 않을 것입니다.)

예를 들면 다음과 같습니다.

$ cat filename
It was
a dark and stormy night.
$ sed '/was/d' filename 1<> filename
$ cat filename
a dark and stormy night.
night.

이 32 바이트의 데이터 때문에 :

I  t     w  a  s \n  a     d  a  r  k     a  n  d     s  t  o  r  m  y     n  i  g  h  t  . \n

이 25 자로 덮어 썼습니다 :

a     d  a  r  k     a  n  d     s  t  o  r  m  y     n  i  g  h  t  . \n

night.\n끝에 7 바이트를 남겨 두십시오.

마지막으로, dd명령은 새로운 스크럽 된 데이터 (이 예에서는 바이트 25)의 끝을 찾고 나머지 파일을 제거합니다. 즉, 해당 시점에서 파일을 자릅니다.


어떤 이유로 든 1<>트릭이 작동하지 않으면 할 수 있습니다

sed '/ myregex / d' / path / to / file / filename | dd of = / path / to / file / filename conv = notrunc

또한, 당신이하고있는 모든 행을 제거 grep -v myregex하는 한 ( Barmar가 지적한 대로 ) 필요한 것입니다.


-3

sed -i 'd'/ path / to / file / filename


1
안녕하세요! 솔루션의 작동 방식과 질문에 대한 답변과 관련하여 자세히 설명하는 것이 가장 좋습니다.
dhag

2
이것은 끔찍한 대답이 아닙니다. (a) 원래 명령과 마찬가지로 전체 파일 시스템에서 실패합니다. (b) 성공하면 정규 표현식과 일치하는 줄이 아니라 WHOLE 파일이 비워집니다.
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.