sed "e"フラグと "g"フラグは一緒に機能しません。

sed

これを考慮すると:

echo AAA | sed -r 's/A/echo B/ge'

わかりました:

Becho Becho B

「BBB」を手に入れると思いました。 GNU sed バージョン 4.2.1 の場合です。何が起こっていますか?どのように実行フラグを使用し、1行で複数の置換を実行できますか(Perlなどではなくシェルで)。

ベストアンサー1

これらのフラグは、予想されるものとは反対の方法で一緒に動作します。これ文書/e、参考までに:

このコマンドを使用すると、シェルコマンドの入力をパターンスペースにパイプできます。置換が行われると、パターン空間内のコマンドが実行され、その出力がパターン空間を置き換えます。末尾の改行は抑制されます。実行するコマンドにヌル文字が含まれている場合、結果は定義されません。これはGNU sed拡張です。

文が少し複雑ですね。つまり、s///その行のコマンドが完了した後に変更が発生した場合(新しい)、行がコマンドとして実行され、その出力がその行を置き換えるために使用されます。

したがって、与えられたコマンドについて:

echo AAA | sed -r 's/A/echo B/ge'

まず、それぞれAecho B、およびそれから結果をコマンドとして実行します。大まかに言えば、次のような効果があります。

echo AAA | sed -r 's/A/echo B/g' | sh

GNUはsed希望のモードを直接サポートしていませんが、必要に応じてより複雑なスクリプトを使用して偽にすることができます。または、コマンド/eに対するPerlの修飾子は、ユーザーsが探している動作を持ちますが、代わりにPerl式を使用します。

おすすめ記事