「sed」内でコマンドを実行する

「sed」内でコマンドを実行する

テキストファイルに保存されている任意のメモリアドレスのリストがあり、それを取り出して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:Like sed:で一度に1行ずつ入力を処理し$_、各行に渡されたperl [e]式を評価し-e、[p]各行の修正を印刷します$_
  • s|X|Y|gei:replace Yin X$_[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 \2es///$SHELL -c$SHELL

関連情報