我有一個由 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 個字符長)!