에서 {}
이 작업을 수행할 수 있는지 궁금합니다 .sed
find -exec
한 가지 예:
find "$dir" -type f -name "*" -exec sed -i s/hello{}a/hello{}b/g '{}' +
중복된 오류 메시지가 표시됩니다 {}
.
find: Only one instance of {} is supported with -exec ... +
발견된 파일을 바꾸는 대신 명령 {}
에 남아 리터럴로 처리되는 방법이 있습니까 ?sed
find
답변1
이 경우 find
중괄호 표현식을 캡처하고 대체 텍스트에서 역참조를 사용하여 exec 구문을 해결할 수 있습니다.
$ cat f1 f2
f1: hello{}a
f2: hello{}a
$ find . -type f -exec sed -i 's/hello\([{][}]\)a/hello\1b/g' '{}' +
$ cat f1 f2
f1: hello{}b
f2: hello{}b
또는 더 간단합니다(설명에서 언급했듯이).
find "$dir" -type f -exec sed -i 's/\(hello[{]}\)a/\1b/g' {} +
Sed의 옵션 은 -i
이식성이 없으며 모든 곳에서 작동하지 않습니다. 주어진 명령은 GNU Sed에서만 작동합니다.
자세한 내용은 다음을 참조하세요.
답변2
한편으로는 +
이것을 사용하고 있으며 이는 -exec
다음과 같은 것을 넣을 수 있음을 의미합니다.많은 종류의대신 {}
인수를 사용하면 원하는 결과를 얻을 수 없으며 sed
(구현에 따라 매우 다르지만) 간단하게 +
.
그러나 이를 수행하는 일반적인 방법은 다음을 사용하는 것입니다 sh -c
.
find "$dir" -type f -exec sh -c 'sed -i "s/hello$1a/hello$1b/g" "$1"' sh {} \;