ファイルで特定の文字列が見つかるたびに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
オプションをサポートしていないので、変更するには出力をリダイレクトする必要があります。
試してみてください