나는 디렉터리의 모든 *.py 파일을 반복적으로 반복하고 파일의 특정 항목을 바꾸는 작은 스크립트를 작성했습니다.
따라서 파일과 현재 내용은 다음과 같습니다.
find . -name "*.py" -exec ls "{}" \; -exec cat "{}" \;
반품:
./1/File1.py
import sys
./2/3/File3.py
import sys
sys.exit(1)
./6/7/File7.py
import sys
sys.exit()
./File0.py
import sys
지금 제가 쓴 스크립트는 이렇습니다.
for file in $(find . -name "*.py")
do
echo "$file"
sed 's/sys.exit.*/os_.exit()/g;s/import sys/&\nimport os/g' "$file"
done
이제 이러한 sed 명령을 개별적으로 실행하면 원하는 출력을 얻을 수 있습니다. 스크립트에서 둘 다 실행하거나 다음과 같이 실행하면:
find . -name "*.py" -exec sed 's/sys.exit.*/os_.exit()/g' "{}" \; -exec sed 's/import sys/&\nimport os/g' "{}" \;
결국 다음과 같이 출력이 반복됩니다.
./1/File1.py
import sys
import sys
import os
./2/3/File3.py
import sys
os_.exit()
import sys
import os
sys.exit(1)
./6/7/File7.py
import sys
os_.exit()
import sys
import os
sys.exit()
./File0.py
import sys
import sys
import os
누군가 내가 뭘 잘못하고 있는지 지적할 수 있나요?
편집하다:don_crissti가 게시한 링크 덕분에 실제로 "한 줄짜리"를 수행하도록 스크립트를 편집했습니다. 아래에 게시했습니다. 의견을 주신 모든 댓글 작성자 덕분에 문제가 해결되었습니다.
find . -name "*.py" -exec ls "{}" \; -exec sed 's/sys.exit.*/os_.exit()/g;s/import sys/&\nimport os/g' "{}" \;
답변1
sed
이 두 명령이 각각 실행되므로 출력은 예상대로입니다.수정되지 않은 동일한 입력 텍스트에 대해. 쿼리자가 예상하는 출력을 얻으려면 두 가지 s
대체 명령을 단일 호출로 결합해야 합니다 sed
.
...-exec sed -e 's/sys.exit.*/os_.exit()/g' -e 's/import sys/&\nimport os/g' "{}" \;
또는
...-exec sed 's/sys.exit.*/os_.exit()/g;s/import sys/&\nimport os/g' "{}" \;