sedのみによるソリューション
sed自体は、変更されていない行と変更された行の両方を生成できます。
$ echo "redis::staging::key" | sed 's/^/RENAME /; p; s/staging/development/g'
RENAME redis::staging::key
RENAME redis::development::key
上記では、sedは最初にRENAME文字列を行の先頭に追加します。次に、p
コマンドは、その時点での行を印刷するようにsedに指示します(「ステージング」はまだ含まれています)。次の置換は「開発」を行い、そのバージョンも印刷されます。
更新: 1行の出力が必要だとします:
$ echo "redis::staging::key" | sed 's/.*/RENAME & &/; s/staging/development/2'
RENAME redis::staging::key redis::development::key
最初のs
上記のコマンドは、先頭にRENAMEを追加してから、行を2倍にします。 2つ目は、2回目のステージングの発生を開発に置き換えます。
xargsバージョンが置換を行わなかったのはなぜですか?
xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')"
xargsが実行される前に、bashは文字列を処理します。特に、$(echo {} | sed 's/staging/development/g')
が表示されます。 そしてそれを実行し(「コマンド置換」)、結果を取得します{}
。したがって、xargsが最終的に実行されると、次のコマンドが表示されます。
xargs -I {} echo "RENAME {} {}"
したがって、s/staging/development/g
置換は行われません。
xargsとシェルを適切な順序で連携させる
これには修正があります:
$ echo "redis::staging::key" | xargs -I {} sh -c 'echo RENAME {} $(echo {} | sed 's/staging/development/g')'
RENAME redis::staging::key redis::development::key
上記では、bashコマンドを一重引用符で囲み、引数としてsh
に渡します。 。このように、文字列はxargsが置換を行うまでシェルによって処理されません。