텍스트 파일에 유니코드 코드 포인트 16A0으로 표시되는 유니코드 문자 ᚠ가 있습니다(텍스트 파일은 utf-8로 인코딩(?)됩니다).
내가 할 때 grep '\u16A0' test.txt
결과가 없습니다. 해당 캐릭터를 어떻게 파악합니까?
답변1
답변2
당신은 사용할 수 있습니다유그레프유니코드 코드 포인트 U+16A0과 일치하도록 grep을 즉시 대체합니다.
ugrep '\x{16A0}' test.txt
grep과 동일한 옵션을 사용하지만 다음과 같이 훨씬 더 많은 기능을 제공합니다.
ugrep은 UTF-8/16/32 입력 및 기타 형식을 검색합니다.. 옵션 -Q를 사용하면 ISO-8859-1~16, EBCDIC, 코드 페이지 437, 850, 858, 1250~1258, MacRoman 및 KIO8과 같은 다른 많은 파일 형식을 검색할 수 있습니다.
ugrep은 유니코드 패턴과 일치합니다.기본적으로(-U 옵션으로 비활성화됨) 정규식 패턴 구문은 PCRE와 유사한 구문으로 확장된 POSIX ERE 호환입니다. 옵션 -P는 유니코드 패턴과 Perl 일치에 사용될 수도 있습니다.
보다GitHub의 ugrep자세한 내용은.
답변3
사용라쿠(이전에는 Perl_6으로 알려짐)
샘플 입력:
https://www.cogsci.ed.ac.uk/~richard/unicode-sample-3-2.html
문자를 일치시키고 다음 줄을 인쇄하십시오.
~$ raku -ne '.put if m/ \x[16A0] /;' file
ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ ᚼ ᚽ ᚾ ᚿ ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ ᛰ
#OR:
~$ raku -e 'lines.grep(/ \x[16A0] /).put;' file
ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ ᚼ ᚽ ᚾ ᚿ ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ ᛰ
문자를 일치시키고 (공백으로 구분된) "단어"를 인쇄합니다.
~$ raku -ne 'for .words() { .put if m/ \x[16A0] / };' file
ᚠ
#OR:
~$ raku -e 'words.grep(/ \x[16A0] /).put;' file
ᚠ
문자를 일치시키고 (정확히) 일치하는 항목을 인쇄합니다.
~$ raku -e 'given slurp() { put m:g/ \x[16A0] / };' file
ᚠ
#OR:
~$ raku -e 'slurp.match(:global,/ \x[16A0] /).put;' file
ᚠ
문자를 일치시키고 일치 항목을 세어 인쇄합니다.
~$ raku -e 'given slurp() { put m:g/ \x[16A0] /.Int };' file
1
#OR:
~$ raku -e 'slurp.match(:global,/ \x[16A0] /).elems.put;' file
1
노트:
Raku에서는 와 같은 유니코드 이름과 쉽게 일치시킬 수 있으며
\c[RUNIC LETTER FEHU FEOH FE F]
, 이는 위와 일치하는 것과 동일한 결과를 제공합니다\x[16A0]
.Raku에서는 와 같은 유니코드 문자와 쉽게 일치시킬 수 있으며 , 이는 이상
ᚠ
과 일치하는 것과 동일한 결과를 제공합니다 .\x[16A0]
\c[RUNIC LETTER FEHU FEOH FE F]
Raku에서는 유니코드 변수(및 유니코드 연산자)를 사용할 수 있습니다. 그래서 이것은 작동합니다 :
~$ raku -e 'my $ᚠ = slurp.match(/ \x[16A0] /); say $ᚠ.Str.raku;' file
"ᚠ"
https://docs.raku.org/언어/regexes#Unicode_properties
https://docs.raku.org/언어/unicode
https://docs.raku.org
https://raku.org
답변4
perl
, pcre2grep
또는 최소한 PCRE 또는 PCRE2를 사용하거나 사용할 수 있는 구현 pcregrep
을 사용하면 문자를 값과 일치시키는 데 grep
사용할 수 있습니다 (또는 값 <= 0xff인 경우에만).\x{16A0}
0x16A0
\xe9
해당 값이 유니코드 코드 포인트가 되려면 입력이 UTF-8에서 디코딩되어야 한다고 알려야 합니다. PCRE/PCRE2에서는 (*UTF)
패턴의 시작 부분에 를 사용하는 방식으로 이루어지지만 (대부분 PCRE_UTF
정규 표현식 엔진에 전달하는 것과 동일), 최신 버전의 GNU에서는 grep
최소한 UTF-8을 참맵으로 사용하는 로케일에서 호출할 때 자동으로 이를 수행합니다. pcregrep
및 을 사용하면 옵션 pcre2grep
을 통해 활성화할 수도 있습니다 -u
( 참조 -U
) pcre2grep
.
에서는 환경 변수 의 (큰 문자) 옵션을 perl
통해 이루어집니다 . 단독 으로 , for는 로케일이 GNU처럼 UTF-8을 사용 하는 경우 입력/출력을 UTF-8로 디코딩/리코딩하거나 무조건 그렇게 하거나 모듈을 사용하여 모든 인코딩에서 명시적으로 디코딩하는 것입니다 .-C
PERL_UNICODE
-C
-CSDL
grep
-CSD
Encode
및 PCRE2( GNU 또는 최신 버전 perl
에서 사용됨 ) 에서는 . 그리고 유니코드 이름은 다음과 같습니다: .pcre2grep
grep
\N{U+16A0}
perl
\N{RUNIC LETTER FEHU FEOH FE F}
그래서:
perl -C -ne 'print if /\x{16A0}/'
perl -C -ne 'print if /\N{U+16A0}/'
perl -C -ne 'print if /\N{RUNIC LETTER FEHU FEOH FE F}/'
PERL_UNICODE=SD perl -ne 'print if /\x{16A0}/'
pcregrep -u '\x{16A0}'
pcregrep '(*UTF)\x{16A0}'
pcre2grep -u '\x{16A0}'
pcre2grep '(*UTF)\x{16A0}'
pcre2grep -U '\x{16A0}'
pcre2grep -u '\N{U+16A0}'
grep -P '\x{16A0}'
UTF-8로 인코딩되지 않은 입력에서 유니코드 값을 기반으로 문자를 일치시키려면 UTF-8에서만 작동하므로 작동하지 않습니다. 단일 바이트 문자 집합에서는 \xHH
by 값(유니코드가 아닌 해당 문자 집합의 코드 포인트)에서 작동합니다.
예를 들어 en_GB.iso885915
유로 기호(U+20AC)가 0xA4에 있는 로케일에서.
$ LC_ALL=en_GB.iso885915 luit
$ locale charmap
ISO-8859-15
$ printf %s € | od -An -vtx1
a4
$ echo € | grep -P '\x{20ac}'
grep: character code point value in \x{} or \o{} is too large
$ echo € | grep -P '\N{U+20ac}'
grep: \N{U+dddd} is supported only in Unicode (UTF) mode
$ echo € | grep -P '(*UTF)\N{U+20ac}'
$ echo € | grep -P '\xA4'
€
따라서 옵션은 텍스트를 UTF-8로 변환하는 것입니다.
$ echo € | iconv -t utf-8 | LC_ALL=C.UTF-8 grep -P '\x{20ac}' | iconv -f utf-8
€
또는 UTF-8이 아닌 로케일의 문자 집합에 따라 입력/출력을 디코딩/인코딩하도록 지시하는 대신 perl
use를 사용하는 경우:-Mopen=locale
-C
$ echo € | perl -Mopen=locale -ne 'print if /\N{U+20ac}/'
€
또는 디코딩을 수행하지 않고 로케일에서 해당 문자의 바이트 값을 일치시킵니다.
예를 들어, GNU나 zsh 또는 최신 버전의 bash를 사용하면 다음과 같습니다 printf
.
$ locale charmap
ISO-8859-15
$ printf '\u20ac' | od -An -vtx1
a4
$ echo € | grep -F -- "$(printf '\u20ac')"
€
zsh에서는 당시 현재 로케일의 문자 인코딩으로 확장되는 which를 사용할 수도 있습니다 $'\u20ac'
(해당 로케일에 해당 문자가 없으면 오류를 보고합니다).
$ echo € | grep -F -- $'\u20ac'
€
ksh93, bash, mksh 및 몇 가지 ash 기반 쉘을 포함한 이후 여러 다른 쉘이 zsh에서 이를 복사했지만 $'\uHHHH'
불행한 차이점이 있습니다. ksh에서는 로케일에 관계없이 UTF-8로 확장되고 bash에서는 코드가 실행될 때가 아니라 코드를 읽을 때의 로케일입니다. 예를 들어 다음과 같습니다 bash
.
LC_CTYPE=C.UTF-8
{
LC_CTYPE=en_GB.iso885915
printf '\xA4\n' | grep -F -- $'\u20ac'
}
또는:
LC_CTYPE=C.UTF-8
euro() {
grep -F -- $'\u20ac'
}
LC_CTYPE=en_GB.iso885915
printf '\xa4\n' | euro
두 경우 모두 셸에서 구문 분석할 때까지 실행되지 않았기 $'\u20ac'
때문에 가 UTF-8 인코딩으로 확장되기 때문에 작동하지 않습니다 .LC_CTYPE=en_GB.iso885915
$'\u20ac'