sql >> データベース >  >> NoSQL >> Redis

xargs変数でsedを使用すると、シェル拡張内で機能しません

    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が置換を行うまでシェルによって処理されません。




    1. MongoDBのMorphia、Mongo4j、Springのデータはどのように比較されますか?

    2. mongodbで段落を保存/表示するにはどうすればよいですか?

    3. StackExchange.Redisとの並列実行?

    4. MongoDBでドキュメントを更新する4つの方法