공백이있는 grep -l 출력 파일 이름


4

파일을 반복하고 싶습니다.

for f in `grep -rsl "foo" . `: do sed -i -- "s/foo/bar/g" $f; done;

그러나 파일 이름은 공백을 포함하므로 공백이 발견 될 때마다 파일 이름이 분할됩니다.

공백이있는 파일 이름을 do블록에 전달하려면 어떻게해야 합니까?


답변:


4

어려운 파일 이름을 처리하려면 파일 이름을 NUL 문자로 구분하는 것이 가장 좋습니다. GNU grep--null옵션으로 xargs이것을 지원하고 -0옵션으로 이것을 지원합니다 . 따라서 다음을 시도하십시오.

grep --null -rslZ "foo" | xargs -0 sed -i -- "s/foo/bar/g"

쉘 루프 사용

grep --null -rslZ "foo" | while IFS= read -r -d $'\0' file
    do 
        sed -i -- "s/foo/bar/g" "$file"
    done

그래서 그것을 작동시킬 방법이 for..in..do..done 없습니까?
doc_id

@slhck 감사합니다. --nullGNU와 FreeBSD에서 모두 지원 하는 답변을 업데이트했습니다 . 그러나 OpenBSD 매뉴얼 페이지 에는 NUL에 대한 지원이 나열되어 있지 않습니다.
John1024

@rahmanisback 아니요 for. 공백이있는 파일 이름을 반복하는 것을 잊어 버릴 수 있습니다 .
lcd047

1
@rahmanisback 아니오, 그건 반 패턴입니다. 파일을 다룰 때, 예를 들어 glob 확장에서만 제대로 작동합니다 for f in *.txt. 거기에서 공상을 시도하지 마십시오. 거의 실패 할 것입니다.
slhck

표준 등 grep의 경우 :find . -type f -print0 | xargs -0 grep -sl 'foo' | tr '\n' '\0' | xargs -0 sed -i -e 's/foo/bar/g' --
lcd047

0

공백이있는 파일 이름을 반복하는 것을 잊어 버릴 수 있습니다.

반드시 그런 것은 아닙니다 ...

IFS=$'\n' && for NAV in `ps aux | egrep -o 'Google Chrome' | sort | uniq`; do
   open -a "$NAV" http://www.google.com
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.