![문자열을 '로 재귀적으로 바꾸는 방법은 무엇입니까?](https://linux55.com/image/208290/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20'%EB%A1%9C%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
(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'
rc
zsh
set -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
제공합니다 . 입력의 각 문자 이름을 제공합니다.ga
uconv -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
구현( find
GNU 시스템의 GNU 포함) 의 경우 로 끝나지만 나머지는 현재 로케일의 문자로 디코딩할 수 없는 파일 이름을 -name '*.tex'
일치시키는 것이 불가능할 수 있습니다 . 예를 들어, 0xe9 바이트만으로는 문자로 디코딩될 수 없기 때문에 문자 인코딩으로 UTF-8을 사용하는 로케일에서 호출된 파일을 .tex
건너뜁니다 . $'St\xe9phane'
명령을 접두어로 사용하면 LC_ALL=C
이 문제를 해결할 수 있습니다.