문자열을 '로 재귀적으로 바꾸는 방법은 무엇입니까?

문자열을 '로 재귀적으로 바꾸는 방법은 무엇입니까?

(Y, d')macOS의 zsh 터미널 창에서 현재 디렉터리에서 시작하는 모든 파일의 모든 인스턴스를 재귀적으로 바꾸려고 합니다 \opair{Y, d'}..tex

다음은 아무 작업도 수행하지 않는 것 같습니다.

find . -type f -name "*.tex" -print0 | xargs -0 sed -i '.bak' -e "s/(Y, d')/\\opair{Y, d'}/g"

어떻게 해결할 수 있나요?

탈출을 시도했지만 '(내가 본 문서에 따르면 sed탈출은 실제로 필요하지 않음) 문제가 해결되지 않았습니다.

답변1

find . -name '*.tex' -type f -exec \
  sed -i.bak -e "s/(Y, d')/\\\\opair{Y, d'}/g" {} +
  • 당신은 X대신에Y
  • xargs표준 구문을 사용할 수 있으면 -exec cmd {} +필요하지 않습니다 .
  • \쉘 이스케이프가 필요합니다(큰따옴표 안에는 여전히 특별함) . 또는 or in 또는 in after 를 sed수행할 수 있습니다. 이는 싱글에서는 특별하지 않습니다(물론 이제 질문은 s를 에 전달하는 방법으로 이동합니다 ).'s/(Y, d'\'')/\\opair{Y, d'\''}/g'rczshset -o rcquotes's/(Y, d'')/\\opair{Y, d''}/g'\'sed
  • for 는 find일반적 -name으로 테스트보다 저렴하므로 -type먼저 두는 것이 좋습니다( find일부 구현에서는 최적화를 위해 자체적으로 재정렬하지만).
  • FreeBSD 이외의 구현(Macos에서도 마찬가지) 의 경우 sed백업 접미사를 이 -i옵션에 추가해야 합니다. FreeBSD와 macos에서는 와 가 모두 -i .bak작동 -i.bak하지만 FreeBSD/macos는 향후 다른 구현과 일치하도록 선택할 수 있으므로 후자가 더 이식성이 뛰어나고 미래 지향적입니다.

또한 동일하게 보이는 캐릭터가 많고 일부 캐릭터는 보이지 않습니다(일부 제어 캐릭터 포함). 예를 들어, Y,와 사이의 공백이 d'줄 바꿈하지 않는 공백(U+00A0)이 아니라 ASCII 공백(U+0020)인지 확인하세요 . 아니면 'U+2019 대신 ASCII 아포스트로피(올바른 인용문)인가요?

in 은 커서 아래에 있는 문자에 대한 정보를 vim제공합니다 . 입력의 각 문자 이름을 제공합니다.gauconv -x name < file

reveal() {
  perl -Mcharnames=full -Mopen=locale -pe 's{[^\t\n -~]}{
    sprintf "<U+%04X %s>", ord($&), charnames::viacode(ord($&))}ge' "$@"
}

사용될 수 있다드러내다(예) 공백, 탭, 줄 바꿈 및 ASCII 인쇄 가능 문자 이외의 문자 <U+3000 IDEOGRAPHIC SPACE>St<U+00E9 LATIN SMALL LETTER E WITH ACUTE>phane. Stéphane

또한 일부 find구현( findGNU 시스템의 GNU 포함) 의 경우 로 끝나지만 나머지는 현재 로케일의 문자로 디코딩할 수 없는 파일 이름을 -name '*.tex'일치시키는 것이 불가능할 수 있습니다 . 예를 들어, 0xe9 바이트만으로는 문자로 디코딩될 수 없기 때문에 문자 인코딩으로 UTF-8을 사용하는 로케일에서 호출된 파일을 .tex건너뜁니다 . $'St\xe9phane'명령을 접두어로 사용하면 LC_ALL=C이 문제를 해결할 수 있습니다.

관련 정보