ファイルの文字列が一致するたびに行をマージする

ファイルの文字列が一致するたびに行をマージする

ファイルで特定の文字列が見つかるたびに2行をマージしたいと思います。

入力例:

{
    id: 23281598
      total: {
        value: 3.0
      }
      isThin: false
      raw: {
        value: 6.0
      }
    }
    total: {
      value: 1.401326182E9
    }
    Pools: {
      value: 8.98886247E8

希望の出力:

{
    id: 23281598
      total: { value: 3.0
      }
      isThin: false
      raw: { value: 6.0
      }
    }
    total: { value: 1.401326182E9
    }
    Pools: { value: 8.98886247E8

ご存知のように、パターンを見つけるたびにvalue:ファイルの前の行と組み合わせたいと思います。各行の先頭のスペースを削除すると、私に効果的です。必要awkまたはsed解決策があります。入力ファイルには固定パターンがありません。含まれている行はvalue:どこにでも表示できますが、連続して表示することはできません。

Solaris 5.10を使用してください。

ベストアンサー1

フロント:

LC_ALL=C sed -e '$!N;/value:/b1' -e 'P;D' -e:1 -e 's/\n[[:space:]]*/ /' <file

とても簡単です:

  • $!N: 最後の行を除く各行について、次の行を読みます。
  • /value:/b1: パターンが一致した場合、名前の付いたブランチに移動1
  • P;D:パターンが一致しない場合は、現在の行を印刷し、$!N上から行を読み取って新しいループを開始します。したがって、ある場合は、line1\nline2印刷してline1新しいループを開始してline2作成する$!Nなどline2\nline3の操作を実行します。
  • :1:名前付きブランチを定義します。1
  • 's/\n[[:space:]]*/ /':四半期に1含まれる改行と先行スペースを単一のスペースに置き換えます。

おすすめ記事