grep -Pzo:リダイレクトされた出力ASCIIテキスト(データの代わりに)を作成する方法は?

grep -Pzo:リダイレクトされた出力ASCIIテキスト(データの代わりに)を作成する方法は?
$ cat t2.c
xxx

$ grep -Pzo xxx t2.c
xxx

$ grep -Pzo xxx t2.c > out1 && file out1
out1: data

ここでは(代わりに)out1ということがわかります。 ASCIIテキストにするにはどうすればよいですか?dataASCII 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

-ztoフラグは、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

おすすめ記事