如何在正则表达式中的两个字符之间插入新行



我正在尝试清理一个文件,该文件似乎没有在新行中写入每个新的日志条目。有些条目最终被附加到前一行的末尾。这使得当我试图使用grep/awk等来分析和获得正确的计数/数据时变得困难…

这就是每一行/条目的样子——注意,我已经替换了日志条目的实际内容,但基本上每个条目都以相同的字符串开始,以相同的模式结束,ID/字符串后面跟着一个数字,例如";ID:20";。

图案:

INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: ##

(请注意,ID后面的数字对于每个条目并不总是相同的(

发生的情况是,文件的某些行最终在同一行上有两个条目:

INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 33
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 20INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 55
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 20
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 27INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 14
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 35INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 22
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 10

我想做的是在上面的第二行;ID:##";以及";INFO";我的文件中受影响的所有行。

我可以通过grep "ID: [0-9]*INFO" mylog.log清除发生这种情况的所有链接

和尝试了许多sed命令,但似乎不知道如何在数字[0-9]*和INFO之间偷偷插入新行"\n"。。。

感谢您的帮助。

给定发布的示例输入/输出,您所需要的只是使用一个具有-E的sed来启用ERE并在替换文本中支持n;换行符";(例如GNU和OSX/BSD seds(:

$ sed -E 's/([0-9]+)INFO/1nINFO/g' file
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 33
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 20
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: ##
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 20
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 27
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: ##
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 35
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 22
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 10

或者在每个Unix盒子上的任何shell中使用任何sed:

sed 's/([0-9][0-9]*)INFO/1
INFO/g' file

如果这对你不起作用,那么修复你的例子,将不起作用的情况包括在内。

使用grep可以执行以下操作:

grep -Eo 'INFO:[[:blank:]].*?ID:[[:blank:]][0-9]+' file
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 33
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 20
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 55
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 20
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 27
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 14
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 35
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 22
INFO: DATA: ## DATA2 ## DATA3: ##.### DATA4: ## ID: 10

一个懒惰的方法是,每当您注意到"INFO";不在最左边的位置,然后将其管道传输到regex模式检查器,以确保它符合DATA。。。DATA4账单。

最新更新