문자열을 $test로 교체

문자열을 $test로 교체

다른 디렉토리를 가진 많은 텍스트 파일이 있습니다. 특정 문자열을 검색해야 하며 해당 문자열을 $test. 이렇게 하려면 모든 디렉터리의 모든 파일을 검색해야 합니다.

예: 파일에 as라는 문자열이 있는데 이 문자열을 로 abcd바꿔야 합니다 . 해당 문자열에 대한 모든 파일을 검색하여 바꾸는 스크립트가 있습니다. 하지만 문자열을 기호로 바꿀 수는 없습니다 . 아래 스크립트에서는 이를 필요로 하지 않습니다 .abcd$test$$

command="find \`pwd\` -name \"*\" -type f -exec grep -l \"abcd\" {} \\; 2>/dev/null | xargs  perl -pi.bak1 -w -e 's/abcd/test/g;'"

아래 스크립트는 $기호와 함께 작동하지 않습니다.

command="find \`pwd\` -name \"*\" -type f -exec grep -l \"abcd\" {} \\; 2>/dev/null | xargs  perl -pi.bak1 -w -e 's/abcd/\$test/g;'"

문자열 abcd$test.

답변1

명령을 변수에 넣으려고 하지 마세요(예: "변수에 저장된 명령을 어떻게 실행할 수 있나요?").

$Perl이 스칼라 변수에 명령을 사용하기 때문에 명령에 문제가 있습니다 . 쉘에서 이스케이프해야 할 뿐만 아니라 Perl( \\\$)에서도 이스케이프해야 합니다.

abcd$test현재 디렉토리 안이나 아래의 모든 파일을 GNU 또는 BSD로 바꾸려면 다음을 사용하십시오.findsed

find . -type f \
    -exec grep -qF 'abcd' {} ';' \
    -exec sed -i.bak 's/abcd/$test/g' {} ';'

그러면 모든 일반 파일을 찾고 해당 문자열이 파일에 있는지 테스트한 후, 그렇다면 해당 문자열로 바꿉니다 $test(접미사가 붙은 원본 파일의 백업 생성 .bak).

같은 일이지만 Perl을 사용하는 경우:

find . -type f \
    -exec grep -qF 'abcd' {} ';' \
    -exec perl -pi.bak -e 's/abcd/$test/g' {} ';'

해당 부분을 제거하면 -exec grep문자열이 포함되어 있지 않더라도 모든 파일의 백업 파일을 얻게 됩니다 abcd.

관련 정보