sedを使用してパターンから1つのケースを引いた各発生を変更するには?

sedを使用してパターンから1つのケースを引いた各発生を変更するには?

cronジョブは30分ごとに一時ファイルを生成し、次の出力を生成します。

---- kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data> kind=<data> field=<value> humankind=<data>

次のようにフォーマットしたいと思います。

---- kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

私は次のsed式を試しました。

sed -r 's|\s(kind=)|\n\1|g' /path/to/file

ただし、出力は次のようになります。

----                                         <------ The first line should be here
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>
kind=<data> field=<value> humankind=<data>

次の表現を使用してください。

sed -r 's|[^-]{4} (kind=)|\n\1|g' /path/to/file

目的の出力を生成しますが、奇妙に動作します。

---- kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>
kind=<data> field=<value> humankind=<incomplete data>

何らかの理由で、最後のフィールド(sed式で使用されたパターンの一部が含まれています)は、「不完全なデータ」の最初の2文字だけを印刷します。

私は何が間違っていましたか?

ベストアンサー1

問題は、sed -r 's|\s(kind=)|\n\1|g' /path/to/fileすべての「種類」(最初の項目を含む)に対して新しい行を挿入して、後に追加の改行を取得することです----。代わりに試してみてください。

sed -E 's|\s(kind=)|\n\1|2g' /path/to/file

最初のゲームをスキップするからです。

2番目は、データの一部である「kind」の前の4文字と一致するため失敗します(長さは6文字でなければなりません)!

おすすめ記事