나는 이 파일을 가지고 있습니다 :
파일.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/