ファイルを読み取って処理できるシェルスクリプトの拡張機能を開発しています。デフォルトでは、入力ファイルにはヘッダーレコードといくつかの詳細レコードが含まれています。ファイルからヘッダーレコードを取得したいと思います。
$ cat sample_file.txt
header1,header2,header3,header4
value1,value2,value3,value4
既存のスクリプトは、次のコマンドを使用してファイルからヘッダーを取得します。
$ cat sample_file.txt | head -1 | egrep -o '[[:print:]]' | tr '\n' '\0'
header1,header2,header3,header4$
egrep -o '[[:print:]]'
ここで何をすべきかわかりません。命令がなくてもegrep
このように入力できます。
タイトルをそのまま印刷してください。
$ cat sample_file.txt | head -1
header1,header2,header3,header4
または最後に改行なしでタイトルを印刷します。
$ cat sample_file.txt | head -1 | tr '\n' '\0'
header1,header2,header3,header4$
マニュアルページには次の内容が記載されていますが、いつ使用するかはegrep
わかりません。[[:print:]]
最後に、以下のように、特定の名前付き文字クラスが角かっこ式内で事前定義されています。その名前は説明を必要とせず、[:alnum:]、[:alpha:]、[:cntrl:]、[:digit:]、[:graph:]、[:lower:]、[:print:])です。 、[:punct:]、[:space:]、[:upper:]、[:xdigit:]。たとえば、[[:alnum:]] は [0-9A-Za-z] を意味しますが、後者の形式は C ロケールと ASCII 文字エンコーディングによって異なりますが、前者はロケールと文字セットに依存しません。 (これらのクラス名の角かっこは記号名の一部であるため、角かっこのリストを区切る角かっこで含める必要があります。)ほとんどのメタ文字はリストの特別な意味を失います。テキスト]を含めるには、まずリストに入れます。同様に、リテラル^を含めるには、始めを除く任意の場所に配置します。最後にテキストを含めるには、最後に入れます。
egrep '[[:print:]]'
オプションの使い方と使用先を理解するのに役立ちますか?
答え1
角かっこ式は似て[abc]
おり、文字の1つと一致します。たとえば、or[abc]
と一致しますが、orと一致しません。角かっこ式内の文字クラスを使用して、角かっこ式に一致するセットにクラス全体を追加できます。コントロール文字、改行、タブを保持しながら、印刷可能な単一の文字と一致します。 、またはより良い方法は、指定されたパターンに一致するすべての行を印刷し、次を使用して一致する部分のみを印刷します。a
b
d
:
[[:print:]]
egrep
grep -E
-o
1行に1つずつ。
たとえば、次を使用すると[:alpha:]
コロンは省略されます。
$ echo ab:c | egrep -o '[[:alpha:]]'
a
b
c
したがって、実際にegrep -o '[[:print:]]'
入力から印刷可能なすべての文字は、1行に1つずつ印刷されます。次に、tr '\n' '\0'
改行文字をNULバイトに変更して、その間にNULを含むすべての印刷可能文字を取得します。 NUL は制御文字よりも扱いが容易ではないため、これが意味があるかどうかはわかりません。less
たとえば、またはで結果データを開くと、NULがカラーでvim
印刷されていることがわかります。^@
繰り返しますが、cat sample_file.txt | head -1 | tr '\n' '\0'
いいえ削除する改行文字は NUL に置き換えられます。
ここで目的が何であるかはわかりませんが、改行文字とタブを削除するには、次のようにしますtr -d
。
... | tr -d '\n\t'
一致する文字セットを補完(反転)-d
するには、印刷できないすべての文字を削除してください。-c
... | tr -dc '[:print:]'
(tr
正規表現のように外部括弧を使用しないことに注意してください。実際には、toの引数はtr
正規表現括弧式の内部部分と同じです。)
答え2
説明は以下にあります。GNU文字クラスと角括弧式文書:
'[:print:]'
印刷可能文字: '[:alnum:]', '[:punct:]' およびスペース。
完全なヘッダが必要な場合egrep
などの解析コマンドは必要ありません。
からman egrep
:
また、バリアントプログラムegrep、fgrep、およびrgrepは、それぞれgrep-E、grep-F、およびgrep-rと同じです。これらのバリエーションは廃止予定ですが、以前のバージョンとの互換性のために提供されています。
したがって、基本的にはとegrep [[:print:]]
同じですgrep -E [[:print:]]
。必要な場合のみ拡張正規表現(ERE)しかし、このモデルは[[:print:]]
そのうちの1つではありません。