2012-12-13 2 views
3

아래 명령은 문자열의 모든 출현을 찾아서이 문자열이있는 파일의 내용을 삭제합니다.전체 행을 grep하고, sed로 전달하고, 행을 삭제하는 방법은 무엇입니까?

find/-maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l {} \; -exec sed -i '/./d' {} \; 

문자열을 찾은 행을 삭제하기 위해 수정하려고 시도했지만 작동시키지 못했습니다.

는 예 테스트 파일 : 그것은 라인 2와 3을 삭제하고 선 사이 간격이없는 것처럼 파일을 떠날 것이다

blah blah blah 
blah blah blah teststring 
teststringblah blah blah 
blah blah blah 

는 :

blah blah blah 
blah blah blah 

답변

7

여기 grepsed -i '/teststring/Id' file에 대한 필요가 file의 모든 행을 삭제하지 teststring(대소 문자 구분 안함)이 포함되어 있으므로 find :

와 결합하면됩니다.
find . -maxdepth 1 -xdev -type f -exec sed -i '/teststring/Id' {} \; 

sed 데모 :

$ cat file 
blah blah blah 
blah blah blah teststring 
teststringblah blah blah 
blah blah blah 

$ sed '/teststring/Id' file 
blah blah blah 
blah blah blah 
+1

Doh, 나는 여분의 이스케이프 문자 인 하하를 사용했습니다. 고마워. – user1166981

+0

아무런 문제없이 도와 드리겠습니다! –

0

당신은 표준 스크립트 도구와 장소에서 파일을 편집 할 수 없습니다. 새 파일을 만든 다음 이전 파일을 새 파일로 바꿀 수 있습니다.

#get a temporary filename 
tmp_file_name=$(mktemp) 
grep -v teststring $my_file_name > $tmp_file_name 
mv $tmp_file_name $myfile_name 
+1

예 ed 또는 sed -i로 할 수 있습니다. 또는 awk 또는 .... Alsom으로 코드를 작성할 수 있습니다. 변수를 인용해야합니다. 작성한대로 파일 이름에 공백이나 글자를 섞는 데 스크립트가 실패합니다. –

+0

변수를 인용 할 때 우수합니다. 내가 sed -i를 놓친 이유는 원래의 문제이기 때문이다. 웬일인지 나는 전염병처럼 awk를 피한다. –

+0

awk을 다시 한 번 살펴보아야합니다. 텍스트 조작을위한 가장 유용한 유닉스 도구이며 가장 단순하고, 가장 쉽고, 유지 보수가 쉽고 확장 가능한 프로그램을 작성할 수있게 해줍니다. –

관련 문제