"sed"를 사용할 때 공백이 아닌 문자를 유지하는 방법

"sed"를 사용할 때 공백이 아닌 문자를 유지하는 방법

sed곧은 따옴표를 둥근 따옴표로 변환하는 표현식을 사용하고 있습니다 . "리눅스 프로그래머 매뉴얼"을 "리눅스 프로그래머 매뉴얼"로 변환하고 싶습니다. 직선 따옴표 앞뒤에 공백이 아닌 문자가 있는지 감지하려면 이 기능이 필요합니다. 있는 경우 곧은 따옴표를 둥근 따옴표로 바꿉니다. 나는 이것을 시도했습니다 :

sed "s/\S'\S/’/"

그러나 이로 인해 공백이 아닌 문자도 대체됩니다.

Linux programme’ manual

답변1

캡처:

sed -e :1 -e "s/\([^[:space:]]\)'\([^[:space:]]\)/\1’\2/g" -e t1

(여기에서는 [^[:space:]]비표준 Perl과 유사한 대신 사용됩니다 \S).

의 목적은 이미 이전 교체의 일부이기 때문에 교체 되지 않는 t1와 같은 입력을 덮어쓰는 것입니다 .X'Y'Zs/.../.../gY'ZY’ZY

perl(어디 에서 왔는지)를 사용하는 경우 \S둘러보기 연산자를 사용할 수 있습니다.

perl -pe "s/(?<=\S)'(?=\S)/’/g"

일부 구현은 with 또는 ast-open의 with sed와 같은 Perl과 유사한 정규식을 지원 하지만 이는 가장 일반적인 구현이 아니며 사용을 권장하는 GNU 구현 도 아닙니다 .ssed-Rsed-Psed\S

현재 로케일 문자 인코딩으로 U+2019 문자를 하드코딩하는 대신 다음을 수행할 수 있습니다.

perl -Mopen=locale -pe "s/(?<=\S)'(?=\S)/\x{2019}/g"

또는:

perl -Mopen=locale -pe "s/(?<=\S)'(?=\S)/\N{RIGHT SINGLE QUOTATION MARK}/g"

인코딩은 스크립트를 호출하는 사용자의 로케일을 기반으로 '대체됩니다 . 예를 들어 인코딩은 ISO8859-7 그리스어 단일 바이트 문자 집합의 경우 0xa2 바이트, UTF-8의 경우 0xe2 0x80 0x99, BIG5 또는 BIG5-HKSCS의 경우 0xa1 0xa6입니다.

관련 정보