回答:
最初に印刷しましょう:
$ 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
以下は正常に動作します。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」というタグを付けただけであることがわかりました。
GNU grepでPerl正規表現を使用することもできます
grep --perl-regexp '\ x {200B}'ファイル名
でmacos
、それに付属しているBSDのはgrepは、マルチバイトをサポートしていないとして、それ、トリッキーです。ただし、GNU grepはHomebrew経由でインストールできますggrep
。
printf
/のgrep
組み合わせを使用していますか?