sed를 사용하여 찾기/바꾸기 일치 항목 수 반환

sed를 사용하여 찾기/바꾸기 일치 항목 수 반환

find및 로 대체된 문자열 수를 계산하려고 합니다 sed.

제가 가장 먼저 말하고 싶은 것은 다음과 같습니다.

# find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {} \;

이는 "finddddd"의 4개 발생을 대체합니다. 이 명령을 실행한 후 명령이 다시 작동하도록 테스트 파일을 재설정했습니다.

wc -l"findddd" 인스턴스를 찾아서 바꾸는 를 사용해 보았지만 아래 줄에 일치하는 항목이 0개 표시됩니다.

# find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {} \; | wc -l
0

이동 wc -l명령도 시도했지만 오류가 발생했습니다.

find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {}| wc -l;
find: missing argument to `-exec'
0

그리고

find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" | wc -l {} \;
wc: {}: No such file or directory
wc: ;: No such file or directory
0 total
find: missing argument to `-exec'

기본 명령에서 일치 항목 수를 출력하도록 하려면 어떻게 해야 합니까?

답변1

잘못된 도구를 사용하고 있습니다. wc입력 줄 수를 계산하지만 을 사용하고 있으므로 sed -i인쇄된 줄이 없으므로 계산할 항목이 없습니다 wc. 이것이 없어도 sed명령은 파일의 모든 줄을 인쇄하므로 여전히 작동하지 않습니다. 다른 접근 방식은 다음과 같습니다.

  1. 대신 펄을 사용하세요

    find . -name \*.php \
      -exec perl -i -lpe 's|finddddd|replaceeeee|g && print STDERR "."' {} \;  \
    2>&1 | wc -l
    

    요령은 .교체가 성공할 때마다 를 인쇄한 다음 결과를 에 전달하는 것입니다 wc. 이 -i플래그는 파일을 내부에서 편집하고 -l각 호출에 줄 바꿈이 추가되도록 합니다. 전달된 스크립트를 적용한 후 각 입력 행을 인쇄하도록 Perl에 print지시합니다 . 파일을 그 자리에서 편집하고 있기 때문에 파일을 파일에 추가 하지 않으려면 STDERR로 인쇄해야 합니다 . 그런 다음 STDERR은 STDOUT( ) 으로 리디렉션되어 .-p-e.2>&1wc

  2. 동일한 줄에서 여러 대체 항목을 개별적으로 계산해야 하는 경우 perl을 다시 사용하십시오.

    find . -name \*.php -exec \
        perl -i -lpe '$l++ while s|finddddd|replaceeeee|; 
        END{print STDERR $l}' {} + 2>&1 
    

    여기서는 Perl 자체가 계산을 수행하고 있습니다. 통화 종료 +대신 통화 종료 를 사용했습니다 . 이는 명령을 가능한 한 적은 수의 명령으로 결합하려고 시도한다는 것을 의미합니다. 파일이 너무 많지 않으면 모두 한 번의 실행으로 전달되며 개수는 정확합니다. 파일이 너무 많으면 실패하므로 다음을 사용해야 합니다.\;-exec.phpperl

    find . -name \*.php -exec \
      perl -lpe '$l++ while s|finddddd|replaceeeee|; 
                 END{print STDERR $l}' {} + 2>&1 >/dev/null | 
      awk '{k+=$1; }END{print k}'
    

관련 정보