답변:
어려운 파일 이름을 처리하려면 파일 이름을 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
없습니까?
--null
GNU와 FreeBSD에서 모두 지원 하는 답변을 업데이트했습니다 . 그러나 OpenBSD 매뉴얼 페이지 에는 NUL에 대한 지원이 나열되어 있지 않습니다.
for
. 공백이있는 파일 이름을 반복하는 것을 잊어 버릴 수 있습니다 .
for f in *.txt
. 거기에서 공상을 시도하지 마십시오. 거의 실패 할 것입니다.
grep
의 경우 :find . -type f -print0 | xargs -0 grep -sl 'foo' | tr '\n' '\0' | xargs -0 sed -i -e 's/foo/bar/g' --
find . -type f -exec grep -qF foo {} \; -exec sed -i 's/foo/bar/g' {} \;