GNU/Linux >> Linux の 問題 >  >> Linux

sed e および g フラグが一緒に機能しない

フラグは、予想とは逆の方法で連携します。 /e のドキュメント 記録のために:

<ブロック引用>

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

それは少し曲がりくねって書かれています。つまり、s/// の完了後、 変更があった場合、(新しい) 行がコマンドとして実行され、その出力がこの行の置換として使用されます。

与えられたコマンドについて:

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

最初に各 A を置き換えます echo B で 、そしてそれから 結果をコマンドとして実行します。これは (大まかに言えば) 以下と同じ効果があります:

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

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


あなたは 複数の置換を取得しますが、複数の実行は取得しません。すべての置換が行われると、パターンが実行されます。

e なし

の結果にフラグを立てる
echo AAA | sed -r 's/A/echo B/g'

です

echo Becho Becho B

これが、実行した場合に実行されるコマンド ラインです。 e を含める

と同等のフラグ
echo 'Becho Becho B'

GNU sed の 's' コマンドに 'e' フラグを付けて使用して 'AAA' から 'BBB' を取得するには、次のようにします:

echo AAA | sed -re 's/A/echo -n B;/ge'

「AAA」は「echo -n B;echo -n B;」に置き換えられます。 echo -n B;' は、最終的に実行されると、グローバル マッチごとに 1 つずつ、3 つの連続して実行される echo コマンドにつながります。 「-n」は、echo の出力から改行文字を省略し、「B」を 1 行にまとめます (ただし、sed は、最終的にパターン スペースを出力するときに、1 つの改行を単独で追加します)。


Linux
  1. Linux Sedコマンド:使用法と例

  2. Sedのスラッシュとバックスラッシュ?

  3. Grubレスキューコマンド。 Ubuntu 13でGrubが機能しませんか?

  1. sed:コマンドが見つかりません

  2. sudo と nohup を連携させる

  3. sudo:bundle コマンドが見つからないのはなぜですか?

  1. マンコマンドが機能していませんか?

  2. エコー改行文字が bash で機能しない

  3. crontab が機能しないのはなぜですか? どうすればトラブルシューティングできますか?