1

SED s ///コマンドの逆参照をパイプに送信する方法はありますか?テキストからエントリを取得するには、エントリを変更してから書き戻します。SED内の置換が機能することがわかりました。

$ echo 'Test ....' | sed 's/Test/'$( echo "<\0>" )'/' 
<Test> ....

しかし、最初のパイプはそうではありません:

$ echo 'Test ....' | sed 's/Test/'$( echo "<\0>" | tr 's' 'x' )'/' 
<Test> ....

理由は何ですか?また、なぜこれが機能するのかまったく理解できません。$()置換は、sedの前に処理する必要があると思いました(引用符を壊したのでなおさらです)。

また、sedを使用して1つのs ///コマンドを別のコマンドに挿入するにはどうすればよいですか?私はbashを使用しています。

4

2 に答える 2

4

コマンドは、tr「<Test>」ではなく、テキスト「<\0>」で動作しています。sedパイプラインが完了するまで、バックリファレンスは展開されません。2番目の例は

foo=$( echo "<\0>" | tr 's' 'x' )
echo 'Test ....' | sed 's/Test/'$foo'/'

tr入力に「テスト」を表示する方法がないため、ここで表示する方が少し簡単です。

于 2012-08-27T14:18:46.220 に答える
2

eGNU sedとフラグを使用すると、目的の効果を実現できます。

echo 'Test ....' | sed 's/Test.*/echo "<\0>" | tr s x/e'

出力:

<Text ....>
于 2012-08-27T15:16:14.800 に答える