이라는 것이 있습니다.부드러운 하이픈. 유니코드 값은 인데 U+00AD
텍스트 편집기에서 볼 수 없습니다.
분명히 내 파일 중 일부가 가득 차 있습니다.
$ perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'
nc
U+006E n
U+00AD
U+0063 c
U+000A
n
와 사이에 c
부드러운 하이픈이 있습니다 . 이 명령을 복사하면 echo nc
(2개가 아닌) 3개의 문자가 있다는 것을 알 수 있습니다.
파일에서 모든 소프트 하이픈(U+00AD)을 제거하는 방법은 무엇입니까?
답변1
그냥 사용하고 sed
(GNU로 테스트했는데 sed
GNU가 아닌 sed가 할 수 있는지는 모르겠습니다) 문자를 sed 표현식에 복사/붙여넣기하세요. 여기서는 명령을 복사 echo nc
하고 실행하여 관심 있는 문자가 포함된 테스트 파일을 제공하는 파일로 출력을 리디렉션했습니다.
$ perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}' file
U+006E n
U+00C2 Â
U+00AD
U+0063 c
U+000A
또한 U+00C2 Â
내가 이해하지 못하지만 유니코드를 모르기 때문에 일종의 유니코드 이상한 점이라고 생각하는 내용을 추가합니다. 파일은 예상한 대로 보이고 실제로는 공백처럼 보이지만 실제로 는 과 사이에 부드러운 a
하이픈이 있습니다 n
.
$ cat file
nc
$ od -c file
0000000 n 302 255 c \n
0000005
어쨌든, 그 명백한 공백을 복사/붙여넣고 에 입력하면 uniprops
다음이 제공됩니다.
$ uniprops ''
U+00AD ‹U+00AD› \N{SOFT HYPHEN}
\pC \p{Cf}
All Any Assigned C Other Case_Ignorable CI Cf Format Changes_When_NFKC_Casefolded CWKCF Common Zyyy Default_Ignorable_Code_Point DI Graph X_POSIX_Graph
Latin_1 Latin_1_Supplement Latin_1_Sup InLatin1 Print X_POSIX_Print Unicode
sed
대체 연산자 에 복사하면 다음이 제공됩니다.
$ sed 's///g' file | perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'
U+006E n
U+0063 c
U+000A
즉, 올바르게 제거됩니다. 따라서 영향을 받는 모든 파일에 이 명령을 적용할 수 있습니다.
sed -i 's///g' file1 file2 ... fileN
먼저 몇 가지 파일에 대해 시도해 보고(그리고 안전한 테스트를 위해 OS 및 sed 구현에 따라 백업을 사용하거나 보관한 다음) 모든 파일에 대해 실행하십시오 -i.bak
.i .bak
답변2
사용행복하다(이전 Perl_6)
raku -pe 's:g/\c[SOFT HYPHEN]//;' file
Raku는 고급 내장 유니코드 지원을 제공합니다. 라이브러리를 로드하거나 명령줄 플래그를 기억할 필요가 없습니다. 위의 내용은 Raku에서 유니코드 문자를 식별하는 방법, \c[SOFT HYPHEN]
즉 이름만 입력하는 방법을 사용합니다! 또는 유니코드 식별자를 사용할 수 있습니다.
raku -pe 's:g/\x00AD//;' file
Raku 버전의 친숙한 대체 연산자에 대해 주의할 점 두 가지: s///
또는 그 약어 바로 뒤에 수식어(Raku에서는 "부사"라고 함)를 배치할 수 있습니다.:global
s
s:global
s:g
둘째, 위 코드의 "백슬래시"가 덜한 버전은 다음과 같습니다.
raku -pe 's:g[\c[SOFT HYPHEN]]="";' file
또는
raku -pe 's:g[\x00AD]="";' file
Raku의 유니코드 지원에 대한 토론은 이 링크를 참조하세요.
https://www.codesections.com/blog/raku-unicode/
https://docs.raku.org/언어/unicode