sed を使用して、パターンのすべての出現箇所から 1 つのケースを除いて置換するにはどうすればよいですか?

sed を使用して、パターンのすべての出現箇所から 1 つのケースを除いて置換するにはどうすればよいですか?

30 分ごとに cron ジョブによって生成される一時ファイルがあり、次のような出力が生成されます。

---- 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 文字の長さである必要があります) であるため失敗します。

関連情報