私は、メモリアドレスの束を表す符号なしのlongリストと、2つの括弧内のオフセット(たとえば、、Mem[offset]
)0x2322AD4[3]
などのデータを含むデータベースを持っています。私が達成したいのは、左角かっこを1つのスペースに置き換え、右角括弧を削除してメモリアドレスからオフセットを分離することです。私が進める手順は次のとおりです。
- 後ろに開いているかっこが続くすべての数字を見つけます。これは、他のデータにむやみに扱うべきではない角括弧を含めることができるからです。
- 角かっこを空白に置き換えます。
- 閉じ括弧が続くすべての数字を見つけ、閉じ括弧だけを空白に置き換えます。
括弧は、次の2つのコマンドを使用して簡単に処理できます。
sed 's/\[/ /' #replace the opening bracket with a single space.
sed 's/\]//' #delete the closing bracket
しかし、繰り返しますが、データベースに保存されている他のデータを混乱させたくありません。
2番目の推測は、逆参照を使用してタスクを処理することです。sed
各数字の後に開く中括弧とその数字を逆参照し、その後にスペースを追加することは可能ですか?結果は次のとおりです。
0x2322AD4 3]
それでは、上記の2番目のコマンドを使用して閉じた中括弧を削除できますか?
問題を解決するまったく異なる方法がある場合は、投稿してください。
答え1
私の考えであなたが探しているのはこれです:
sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/\1 \2/g'
たとえば、
$ sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/\1 \2/g' <<EOF
> mem+offset: 0x2322AD4[3] 0x232BEEF[12]
> unchanged: 0x22343AF word[2] 7E[word]
> EOF
mem+offset: 0x2322AD4 3 0x232BEEF 12
unchanged: 0x22343AF word[2] 7E[word]
$
注:0 [xX]がない場合は、2番目の入力ラインでd [2]を置き換えることができると見なされます。
答え2
私はそれを見つけることができます。今後のアクセスに関するこの質問に対する回答は次のとおりです。
sed -r 's/(0[Xx][A-Fa-f0-9]+)\[([0-9]+)\]/\1 \2/g'