전역 검색+바꾸기(테스트가 통과한 경우에만)

전역 검색+바꾸기(테스트가 통과한 경우에만)

전역 검색을 수행하고 파일 디렉터리를 바꾸고 싶습니다. 이를 수행하는 방법은 여러 가지가 있지만(많은 편집자, sed+find) 추가 요구 사항이 있습니다. 가능한 각 교체에 대해 쉘 스크립트를 실행하고 스크립트가 통과하는 경우에만 변경 사항을 유지하고 싶습니다.

예를 들어, 내가 Rust 코드에서 "pub"를 ​​너무 많이 사용하기로 결정하고 내 코드를 "덜 공개적으로" 만들고 싶다고 가정해 보겠습니다.

다음을 실행할 수 있습니다. sed -e 's/pub//g' -i $(find . -name "*.rs")모든 항목을 제거하려면 을 실행해야 하지만 그 중 일부는 필수이므로 s를 한 번에 하나씩 제거하고 각 항목 이후에 실행 pub하려고 합니다 .pubcargo check

답변1

설명에 따르면 단일 교체품을 테스트하고 이를 유지하거나 롤백해야 함을 나타냅니다. 따라서 해당 위치에서 수정하고 테스트한 후 실패하면 백업 파일을 복원하고, 성공하면 아무 작업도 수행하지 않을 수 있습니다.

또한 거부된 동일한 변경 사항을 다시 테스트하지 않도록 무슨 일이 일어났는지 추적해야 합니다. 패턴이 한 줄에 한 번 발생할 수 있다고 가정하면 파일에 다음과 같은 것을 사용할 수 있습니다.

line_numbers=( $(sed -n '/pub/=' "$1") )

for i in "${line_numbers[@]}"; do
    sed -i.old "${i}s/pub//" "$1" && run_test || mv "$1.old" "$1"
done

각 사례를 한 번 테스트하기 위해 발생하는 줄 번호만 저장합니다. 첫 번째는 줄 번호를 얻는 것과 sed유사합니다 . grep -n일치하는 항목이 없으면 다음 루프는 0회 실행됩니다. 두 번째는 sed특정 줄 번호만 바꾸는 것입니다 $i. 큰따옴표는 변수를 sed 표현식으로 확장하는 데 사용됩니다.

파일에 대해 실행하십시오.

find . -type f -name '*.rs' -exec sh script.sh {} \;

또한 모든 백업 파일을 정리 *.old하고 대상 디렉터리에 없는 백업 확장자를 선택해야 합니다.

파일 구조, 패턴의 빈도, run_test실제로 실행 중인 항목에 따라 많은 프로세스를 호출하므로 속도가 느려질 수 있습니다. 또한 항상 실행하기 전에 데이터를 제대로 백업했는지 확인하십시오.

관련 정보