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

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

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進数)でキャプチャされた部分文字列に置き換えることができます。

答え2

いくつかの奇妙な場合:

awk 'match($0,/0x[0-9a-zA-Z]*/) {print $0; print substr($0,RSTART,RLENGTH)}' file

GNU awkを使う:

gawk 'match($0,/0x[0-9a-zA-Z]*/,arr) {print $0; print arr[0]}' file

0x[0-9a-zA-Z]*交換を検討することもできます。0x[[:xdigit:]]+

答え3

awkを使用してください。

$ awk '{r=$0; sub(/[^:]+/,""); print r ORS $2}' file
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

ご質問の該当行が実際にお客様の入力内容に存在しないと思います...ので削除いたします。

関連情報