특정 확장자를 가진 파일에 대해 쉘 스크립트에서 sed 사용

특정 확장자를 가진 파일에 대해 쉘 스크립트에서 sed 사용

sed를 사용하여 특정 확장자를 가진 파일을 찾은 다음 특정 문자열을 다른 문자열로 바꾸려고 합니다.

No directory mentioned using current directory
*.h
sed: can't read *.h: No such file or directory
*.C
sed: can't read *.C: No such file or directory
*.cc
sed: can't read *.cc: No such file or directory
un.cpp

내 스크립트의 코드는 다음과 같습니다.

for file in *.{h,C,cc,cpp}
       do
          echo $file;
          sed -i -e 's/${1}/${2}/g' $file;
       done

하위 폴더에서 sed를 재귀적으로 사용하기 위해 find를 사용하려고 할 때 비슷한 문제가 발생했습니다.

find ./*.{h,C,cc,cpp} -type f -exec sed -i -e 's/${2}/${3}/g' {} \;

감사해요

답변1

find . -type f -a \( -name "*.h" -o -name "*.C" -o -name "*.cc" -o -name "*.cpp" \) -a -exec sed -i -e "s/${2}/${3}/g" {} +

작동해야합니다.

첫 번째 스크립트에서 문제는 일치하는 항목이 없으면 *.hbash가 리터럴을 *.hsed에 전달한 다음 sed가 파일 이름이라고 생각하지만 그러한 파일이 없기 때문에 실패한다는 것입니다.

두 번째 경우에는 를 사용하여 find(1)쉘이 현재 디렉토리에서 일치하는 파일 이름을 찾은 다음 이를 find(1)에 전달합니다.

sed 문에서 쉘이 인용된 문자열에서 변수 확장을 수행하려면 작은 따옴표 대신 큰 따옴표가 필요합니다.

관련 정보