$ cat t2.c
xxx
$ grep -Pzo xxx t2.c
xxx
$ grep -Pzo xxx t2.c > out1 && file out1
out1: data
ここでは(代わりに)out1
ということがわかります。 ASCIIテキストにするにはどうすればよいですか?data
ASCII text
UPD。-z
複数行の一致が必要です。更新された例は次のとおりです。
$ cat t2.c
xxx
yyy
zzz
$ grep -Pzo '(?s)xxx.*zzz' t2.c
xxx
yyy
zzz
$ grep -Pzo '(?s)xxx.*zzz' t2.c > out1 && file out1
out1: data
答え1
独自の例を使用してください。
echo xxx >t2.c
grep -Pzo xxx t2.c > out1 && file out1
out1: data
grep -Po xxx t2.c > out1 && file out1
out1: ASCII text
-z
toフラグは、grep
入力と(より重要なのは)出力の両方に対してNULLで終わるデータと共に使用するためのものです。ドキュメント(man grep
)から引用:
-z, --null-data
入出力データを一連の行として扱います。各行は改行文字の代わりに0バイト(ASCII NUL文字)で終わります。 -Zまたは--nullオプションと同様に、このオプションはsort -zなどのコマンドと一緒に使用して任意のファイル名を処理できます。
次のツールを使用してこれを確認できますod
。
$ od -c out1
0000000 x x x \0
0000004
\0
最後はNULLです。このfile
コマンドはNULL文字を確認し、ファイルがASCIIまたは他の種類のテキストになることができないことを正しく決定します。フォールバックポイントはun Definedですdata
。これがまさにあなたが見るものです。
解決策?-z
入力が NULL で終わるレコードを提供する場合を除き、使用しないでください。そして出力はNULLで終わるレコードに区切ることもできます。あるいは、ファイルに保存する前にNULLを単に削除することもできます。
$ grep -Pzo xxx t2.c | tr -d '\0' > out1 && file out1
out1: ASCII text, with no line terminators