모든 파일에서 재귀 적으로 줄 찾기 및 삭제


14

사용하여 키워드의 발생을 파악했습니다.

grep "KeyWord" . -r -n -i -I 

그러나 KeyWord의 발생이 너무 큽니다. 그 단어를 포함하는 모든 줄을 삭제하고 싶습니다.

나는 sed가 유틸리티 인 것처럼 보입니다. 누구든지 트릭을 수행하는 명령을 말해 줄 수 있습니까?

감사.

답변:


25

GNU sed로 :

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

OSX sed로 :

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

첫 번째 명령 find은 모든 표준 파일 (디렉토리 나 파이프 등이 아님)을 찾아서 구분하여 인쇄합니다 \0(파일 이름에 공백, 줄 바꿈 등이 포함될 수 있음).

두 번째 명령 xargs은의 출력을 읽고 find구분 기호를 기반으로 목록을 가져 옵니다 ( \0때문에 -0) sed -i [...]. 목록에서 추가 된 매개 변수를 사용하여 호출합니다 sed. 각 호출).

sed명령은 내부 ( -i)를 수정합니다 .

에 관해서 /KeyWord/d는 정규 표현식을 포함하는 행을 삭제합니다 KeyWord.

당신은 배워야 sed제대로 (단순하지만 특이한) 구문을 이해하고, 여기에 포함 된 도구에 대한 자세한 내용은 해당 맨 페이지를 참조 할 수 있습니다.


그리고 내가 홍보하고 싶을 zsh때 확장 된 globs가있는 솔루션 :

sed -i /KeyWord/d **/*(.)

"키워드"라는 단어를 삭제하는 것은 어떻습니까. 그리고 전체 라인이 아닌?
SurenNihalani

s/KeyWord//g( 모든 줄에 대해 KeyWord''(빈 문자열)로 대체 ( g각 줄의 첫 번째 줄뿐만 아니라)
Pierre Carrier

1

Ex 모드에서 Vim을 사용할 수 있습니다 :

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g 글로벌 검색

  2. d 지우다

  3. x 저장하고 닫습니다


나에게 준 OSX find: illegal option -- t에서. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.