Perl 찾기 및 바꾸기는 각 파일에 기록됩니다.

Perl 찾기 및 바꾸기는 각 파일에 기록됩니다.

이것은 내가 실행중인 테스트 스크립트입니다.

matt@server:~ $ cat test.sh
#!/bin/bash
mkdir test
cd test
echo "has the string foo" > yes.txt
echo "hasn't the string" > no.txt
ls -l --time-style=full-iso
cat *
perl -e 's/foo/bar/g;' -pi $(find -type f)
ls -l --time-style=full-iso
cat *
matt@server:~ $ ./test.sh
total 8
-rw-r--r-- 1 matt matt 18 2011-01-29 13:52:17.240316663 -0700 no.txt
-rw-r--r-- 1 matt matt 19 2011-01-29 13:52:17.240316663 -0700 yes.txt
hasn't the string
has the string foo
total 8
-rw-r--r-- 1 matt matt 18 2011-01-29 13:52:17.260317727 -0700 no.txt
-rw-r--r-- 1 matt matt 19 2011-01-29 13:52:17.260317727 -0700 yes.txt
hasn't the string
has the string bar

이 줄을 조정하는 방법을 알아내야 합니다.

perl -e 's/foo/bar/g;' -pi $(find -type f)

찾은 모든 파일을 작성하는 대신 변경해야 하는 파일만 작성합니다.

답변1

이는 적절한 교체여야 합니다.

grep -l foo * | sed -e 's/[^/0-9A-Z_a-z]/\\&/g' | xargs sed -i 's/foo/bar/g'

답변2

이 시도:

perl -e 's/foo/bar/g;' -pi `egrep -l 'foo' $(find -type f)`

정규식을 검색하고 그것이 발견된 파일 이름을 반환합니다. 그러면 Perl은 이러한 파일에서만 작동합니다.

관련 정보