テキストファイルに保存されている任意のメモリアドレスのリストがあり、それを取り出してsed
デコードしてから再度ファイルに保存する必要があります。しかし、私がやろうとしているデコードは、私がしばらく前に作成したC ++プログラムで処理されます。今経験している問題は、sed
コマンドでC ++を実行することです。つまり、デコードする必要がある部分を逆参照して、C++ プログラムでパラメータとして使用したいのです。私は次のコマンドを書きました。
cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';
私が答えを読む機会を持つ前にこれ投稿にはsed
コマンドが実行されないと言いました。実際にsed
コマンドを実行することは許可されていませんか?もしそうなら、私が書いたコマンドが有効なシーケンスであると仮定するsed
と、どのように書きますかperl
?
答え1
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
perl -pe
:Likesed
:で一度に1行ずつ入力を処理し$_
、各行に渡されたperl [e]式を評価し-e
、[p]各行の修正を印刷します$_
。s|X|Y|gei
:replaceY
inX
($_
[g]グローバル、大文字と小文字を区別しない[i]、Y
デフォルトの文字列ではなくperl [e]式として扱われます)。(?<=0x)
:後ろを見てください0x
。[0-9a-f]{1,8}
:16進数1〜8桁、できるだけ多く`./convAddrs $&`
:シェルコマンドラインの出力を$&
一致する部分に置き換えます。
答え2
sed
コマンドを実行できないことが事実である場合も、そうでない場合もあります。これはいいえGNUの実際の状況sed
:
sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e 's/\n.//gp;g;s/^/#/e' <"$1"
あなたの入力内容に正確に何があるのかはわかりませんので、パターンスペースにない内容をコメントアウトすることに<$1
注意してください。置換時にGNUのxecuteフラグを使用すると、結果パターン領域全体を2番目の引数として渡し、すべてのパターン空間をstdoutに書き込まれた内容に置き換えます。したがって、上記では、最初に結果を印刷してから、コマンドラインをシェルに渡してから印刷します。#
command \2
e
s///
$SHELL -c
$SHELL