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