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