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