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


9

テキストファイルに保存されたランダムメモリアドレスのリストがありsedます。それらを取り出してデコードし、ファイルに保存する必要があります。ただし、実行しようとしているデコード操作は、少し前に作成したC ++プログラムで処理されます。現在直面している問題は、sedコマンド内でC ++を実行することです。つまり、デコードが必要な部分を後方参照し、それをC ++プログラムの引数として使用したいのです。私は次のコマンドを書きました:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

コマンドを実行しないというこの投稿の回答を読む機会があった前にsedsedコマンドの実行を許可しないのは本当ですか?もしそうなら、私が書いたコマンドが有効なsedシーケンスであると仮定すると、どのようにそれを書けperlますか?


リンクを追加しました。私の悪い:)
Fadi Hanna AL-Kass 2013

回答:


8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe:のようにsed:入力を一度に1行ずつ処理し、$_各行に渡されたperl [e] xpressionを評価して-e、[p]修正さ$_れたそれぞれを修正します。
  • s|X|Y|gei:の代わりにY使用Xします$_([g] lobally、case [i] nsensitively、およびY基本的な文字列ではなくperl [e] xpressionとして扱う)。
  • (?<=0x):を後ろに見てください0x
  • [0-9a-f]{1,8}:1から8桁の16進数、できるだけ多く
  • `./convAddrs $&`$&が一致する部分で置き換えられるシェルコマンドラインの出力で置き換えます。

コマンドを実行すると、次のエラーが発生します。パターンと次の単語の間にスペースがないと、-e行1で廃止されます。正規表現修飾子「/ a」と「/ d」は、-e行1で相互に排他的です行の正規表現修飾子 "/ a"と "/ d"は-e行1で相互に排他的です行末で-e行1のEOFの前に文字列ターミネータ "` "が見つかりません
Fadi Hanna AL-Kass

1
もちろん、申し訳ありませんが、セパレータ/は交換部品の内部で使用されているため、ここでは使用できないため、セパレータを変更する必要があります。修正。
ステファンChazelas

くそー、それでもはPerlのワンライナーでかなり上手だったけど、+ 1!
terdon

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入力に他に何があるのか​​正確にはわかりません。パターンスペースに#ないものはコメントアウトするように注意しcommand \2ます。eubstitutionでGNUのxecuteフラグを使用s///すると、結果のパターンスペース全体$SHELL -cが2番目の引数として渡され、その後、すべてのパターンスペースがその$SHELLstdoutに書き込まれたものに置き換えられます。したがって、上記のコマンドを実行すると、最初に結果が出力され、その後、コマンドラインをシェルに渡した結果が出力されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.