行全体に一致する部分行を収集する方法は?

行全体に一致する部分行を収集する方法は?

full lineラインのとを同時に出力できますか?matched parts

この入力があるとしましょう。

low [ 0]: 0xffff0000 Interesting description A
hi  [ 0]: 0xffff00a0 Interesting description B
low [ 1]:     0x5000 Interesting description C
hi  [ 1]:     0x6000 Interesting description D
...
hi  [15]:   0x806000 ...

興味深い部分に16進値を抽出してから、行全体を抽出したいと思います。 Pasteと2つのgrepコマンドを試してみましたが、非常にかさばる気がし、プロセスの交換を避けたい(<())。これが私が得るものです:

paste -d'\n' <(grep    '0x[0-9a-zA-Z]*' "$file") \
             <(grep -o '0x[0-9a-zA-Z]*' "$file")

これを行うためのより重要な方法は何ですか? awkを検討していますが、一致する部分を簡単にインポートして印刷できるかどうかはわかりません(???下)。

/0x[0-9a-zA-Z]*/ { print $0 ; print ??? }

出力例:

low [ 0]: 0xffff0000 Interesting description A
0xffff0000 
hi  [ 0]: 0xffff00a0 Interesting description B
0xffff00a0 
low [ 1]:     0x5000 Interesting description C
0x5000 
hi  [ 1]:     0x6000 Interesting description D
0x6000 
...
hi  [15]:   0x806000 ...
0x806000 

ベストアンサー1

おそらく、次の方法でこれを行いますsed

sed -e '/.*\(0x[[:xdigit:]]*\).*/!d' -e p -e 's//\1/' file

まず、フォーマットに16進数が含まれていない行をすべて削除します0xnnnn...。行が削除されない場合は、変更されていない行を印刷し、再出力する前に単に16進数に置き換えます。

最後のステップでは、最初の編集式で使用された正規表現を再利用します。つまり、\1一致するすべての項目(行全体)を角かっこ内のサブ式(16進数)でキャプチャされた部分文字列に置き換えることができます。

おすすめ記事