如何使用 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 个字符长)!

相关内容