如何使用 sed 取代每一次出現的模式減去一個大小寫?

如何使用 sed 取代每一次出現的模式減去一個大小寫?

我有一個由 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 表達式中使用的模式的一部分)僅列印「不完整資料」的前兩個字元。

我究竟做錯了什麼?

答案1

問題在於sed -r 's|\s(kind=)|\n\1|g' /path/to/file,您為所有「種類」的出現(包括第一個)插入了一個新行,因此您會在 後面得到一個額外的換行符----。相反,嘗試

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

因為它會跳過第一場比賽。

第二個失敗,因為它匹配“kind”之前的 4 個字符,而這是數據的一部分(必須是 6 個字符長)!

相關內容