![如何使用 sed 替换每一次出现的模式减去一个大小写?](https://linux22.com/image/168874/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E6%AF%8F%E4%B8%80%E6%AC%A1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%A8%A1%E5%BC%8F%E5%87%8F%E5%8E%BB%E4%B8%80%E4%B8%AA%E5%A4%A7%E5%B0%8F%E5%86%99%EF%BC%9F.png)
我有一个由 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 个字符长)!