sed 명령을 find -exec와 함께 사용할 수 없나요?

sed 명령을 find -exec와 함께 사용할 수 없나요?

나는 이 파일을 가지고 있습니다 :

파일.txt:

...
threshold:
  swipe: 2
  pinch: 2 

interval:
  swipe: 2
  pinch: 2

아니요, 그렇게 하면:

$ locate config.yml | while read i; do sed '/swipe|pinch/s/[0-9]/3/' $i; done

2다음과 같이 변경됩니다 3.

 ...
    threshold:
      swipe: 3
      pinch: 3 

    interval:
      swipe: 3
      pinch: 3

하지만 다음은 find그렇지 않습니다.

sudo find / -name config.yml -exec sed -n '/swipe|pinch/s/[0-9]/3/' '{}' \+

정규식은 동일하므로 문제가 되지 않습니다. 무엇이 문제입니까?

답변1

상단에서 파일 이름을 참조 file.txt하지만 해당 이름의 파일만 처리되므로 이러한 패턴이 포함되어 있다고 config.yml가정합니다 .config.yml

locate그리고bash 상표이것은 둘 중 하나와 아무 관련이 없기 때문에 약간 오해의 소지가 있습니다 :) 더 중요한 것은 이것이 어떤 종류의 환경입니까? Linux 시스템에서는GNU/sed일반적으로 설치되며 -E옵션이 필요합니다.이해하다상태 swipe|pinch. 그것 없이도 대괄호 표현식( [0-9]패턴의 일부)은 작동합니다 -E.

따라서 이를 염두에 두고 다음은 GNU/sed 및BSD/sed:

locate config.yml | while read -r i; do sed -E '/swipe|pinch/s/[0-9]/3/' "$i"; done

또는 다음을 사용하여 find:

find . -name config.yml -exec sed -E '/swipe|pinch/s/[0-9]/3/' '{}' +

참고: 패턴이 /swipe|pinch/정확합니다. 파이프 기호를 이스케이프하도록 변경하라는 제안은 /swipe\|pinch/이제 더 이상 정규식이 아니며 리터럴과 일치하므로 |파일의 어떤 항목과도 ​​일치하지 않기 때문에 작동하지 않습니다. 그러나 그것은회의주변 아포스트로피( ')를 생략하면 작동합니다.

sed -E /swipe\|pinch/s/[0-9]/3/

관련 정보