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

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

ファイルで特定の文字列が見つかるたびに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含まれる改行と先行スペースを単一のスペースに置き換えます。

答え2

作業を簡単にしてください。

sed 'N;s/\n[[:space:]]*value:/ value:/;P;D'

N;P;D常に2つの行を同時に処理するループを実行します($!ここでは必要ありません)。内部で改行文字を空白に変更し、value:空白に置き換えます。それはすべてです。

答え3

sed以下を試すこともできます。

sed -e '/: {$/{N;s/\n//g}' -e 's/{.*v/{ v/g' file

説明する:

  • /開始条件
  • : {$行が次に終わる場合: {
  • /終了条件
  • {アクショングループの開始
  • N;次の行を一致する行にリンクします。
  • s/\n//g交換する\n
  • }ワークグループの終了

フォーマットされた出力オプション

  • 's/{.*v/{ v/g'別の式を実行して、{&(スペース)間vのすべての項目を単一のスペースに置き換えます.

私の知る限り、Solarisは-iオプションをサポートしていないので、変更するには出力をリダイレクトする必要があります。

試してみてください

関連情報