![如何在特定模式后插入一行?](https://linux22.com/image/911512/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%89%B9%E5%AE%9A%E6%A8%A1%E5%BC%8F%E5%90%8E%E6%8F%92%E5%85%A5%E4%B8%80%E8%A1%8C%EF%BC%9F.png)
我试图在以下示例文件中的“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
&
右侧的 被替换为整个匹配,因此您无需创建组。$
如果表达式以 结尾,则末尾 是不必要的.*
。g
lobally 标志会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
进一步阅读
- GNU sed 手册第 5.6 章正则表达式扩展解释公认的速记类别