Unicode文字「ZERO WIDTH SPACE」(U + 200B)をgrepするLinuxシェルコマンド?


5

grepLinuxでUnicode文字「ZERO WIDTH SPACE」(U + 200B)を使用するにはどうすればよいですか?

$ grep '%U200B' filename?

どのdistro / shell / printf/のgrep組み合わせを使用していますか?
l0b0

回答:


5

最初に印刷しましょう:

$ printf %b '\u200b' | uniname
character  byte       UTF-32   encoded as     glyph   name
        0          0  00200B   E2 80 8B               ZERO WIDTH SPACE

これで、同じフォーマットを使用して検索できるようになります(Bashを使用):

$ printf %b '\u200b' | grep -q "$(printf %b '\u200b')"
$ echo $?
0

ここでのトリックprintf %bは、引数をエンコードされた文字として扱うため、\xシングルバイト文字の印刷に使用でき、\uマルチバイト文字の印刷に*を使用できます。

ファイルで見つけるには、次のようにします。

grep "$(printf %b '\u200b')" filename

* POSIX仕様は、実際にどのように%b機能するかについて明確ではありません。printfページには、「%bの変換仕様は[...]エコーユーティリティによって提供される文字列オペランドに展開-escapesを処理するために、移植性のある方法として、ここに追加されました」と言うと、ページは、その使用の単一文書化されていない例を示します。echo

テスト:

$ printf %b '\u200b' > test.txt
$ grep -q "$(printf %b '\u200b')" test.txt
$ echo $?
0

ありがとうございました。私は自分の質問を詳しく説明しなければならないと思います。Linuxのファイルの1行に<200e>があります。今、私はLinuxシェルでgrepを使用してそれをキャッチする必要があります。ファイルを開くことなく、すなわち
ディネッシュ

grep "$(printf%b '\ u200b')"ファイル名が機能しない
ディネッシュ14

4

以下は正常に動作します。BabelMap(google)でファイルを作成し、保存オプションを使用しました。

行番号1〜5のファイルを作成し、行4にゼロlenスペースを追加しました。

> hexdump testout.txt -C                 
00000000  31 0a 32 0a 32 0a 33 0a  34 20 e2 80 8b 0a 35 0a  |1.2.2.3.4 ....5.|
00000010

ファイル内の文字「e2808b」のutf8エンコーディングに注意してください。

この単純なgrepは正しい行を見つけます。

> grep $'\u200b' testout.txt  
4 ​
> grep $'\u200b' testout.txt|hexdump -C
00000000  34 20 e2 80 8b 0a                                 |4 ....|
00000006 

FWIW、私のGREP_OPTIONSは「--color = auto -I -D skip -d skip」に設定されていますが、それらのどれも関連性があるとは思いません。


$'...'ポータブルではありません。OPが質問に「shell」というタグを付けただけであることがわかりました。
l0b0 14

シェルだけでなく、Linuxシェル。bashほどLinuxに関連するシェルについては知りません。
アスタラ14

0

GNU grepでPerl正規表現を使用することもできます

grep --perl-regexp '\ x {200B}'ファイル名

macos、それに付属しているBSDのはgrepは、マルチバイトをサポートしていないとして、それ、トリッキーです。ただし、GNU grepはHomebrew経由でインストールできますggrep

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.