如何在特定模式后插入一行?

如何在特定模式后插入一行?

我试图在以下示例文件中的“3 3 1 May 7 05:31:11 2019”行后插入一个名为“无评论”的模式

INV_YTEC_TR::
3 3 1 五月 7 05:31:11 2019
加州 AOI1 0 0 -1 -3176120 1602000 12
0.4

尝试按照 sed 代码,但没有帮助。

sed -i 's/\(^\d+\s+\d+\s+\d+\s+[A-Za-z]+\s+\d+\s+\d+:\d+:\d+\s+\d+.*$\)/\1\nno comments/ig' tmp.txt

有人能帮我提供正确的 sed 命令吗?

问候, Shikha

答案1

GNUsed不知道\d简写,您可以使用[0-9][:digit:]代替,并且您需要启用扩展正则表达式(ERE)语法并选择-r+其识别为元字符:

sed -ir 's/^[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-Za-z]+\s+[0-9]+\s+[0-9]+:[0-9]+:[0-9]+\s+[0-9]+.*/&\nno comments/' tmp.txt

&右侧的 被替换为整个匹配,因此您无需创建组。$如果表达式以 结尾,则末尾 是不必要的.*globally 标志会sed替换行中的所有匹配项,如果您已经匹配了整行,则不需要这样做。 flagei使正则表达式不区分大小写,但是您已经通过使用[A-Za-z]and 而不是[a-z]or做到了这一点[A-Z],因此您也可以省略它。

组不仅是一种剪切匹配部分以用于替换的方法,而且还是一种组合序列的方法。在你的情况下,它们可以方便地合并,例如

[0-9]+\s+[0-9]+\s+[0-9]+\s+

([0-9]+\s+){3}

这会缩短你的正则表达式:

sed -ir 's/^([0-9]+\s+){3}[A-Za-z]+\s+[0-9]+\s+([0-9]+:){2}[0-9]+\s+[0-9]+.*/&\nno comments/' tmp.txt

示例运行

$ <s sed -r 's/^([0-9]+\s+){3}[A-Za-z]+\s+[0-9]+\s+([0-9]+:){2}[0-9]+\s+[0-9]+.*/&\nno comments/'
INV_YTEC_TR::
3 3 1 May  7 05:31:11 2019
no comments
CA AOI1 0 0 -1 -3176120 1602000 12
A 0.4

进一步阅读

相关内容