SED删除带有REGEX模式的行

时间:2016-10-25 13:33:23

标签: regex bash unix sed

我有数百个包含数千行的文件,我需要删除一些跟随模式的行,所以我用正则表达式去了SED。文件的结构是这样的

A,12121212121212,foo,bar,lorem
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
A,21212121212121,foo,bar,lorem
C,32JL,JL
C,32JL,JL
C,32JL,JL
A,9999,88888,77777

我需要删除所有以“ A ”开头并以“ lorem ”结尾的行

预期产出 -

C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
A,9999,88888,77777

我制作了正则表达式:

^(A).*(lorem)

它在我的文本编辑器(Sublime,UltraEdit)中匹配

在UNIX shell中

sed '/^(A).*(lorem)/d' file.txt

但不知何故它不起作用,它显示整个文件,我无法弄清楚原因。

有人能帮助我吗?

3 个答案:

答案 0 :(得分:5)

其他人给了你正确的解决方案,但没有解释你的正则表达式为什么不起作用。 ()肯定没用,但如果你将正则表达式与其他工具/语言一起使用,你可能会得到预期的结果。

它不能与sed一起使用,因为它默认使用POSIX's basic regular expressions,其中分组的字符为\(\),而{{1} }和(将匹配文字字符。输入文本中没有这样的括号,因此它没有匹配。

如果您使用过GNU的)或BSD' sed -r,那么您的正则表达式将起作用,该标志会切换到POSIX的扩展正则表达式{{1} 1}}和sed -E用于分组,( )与文字括号匹配。

总之,以下命令将执行相同的操作:

  • \(
  • \)(使用GNU sed)
  • sed '/^A.*lorem$/d' file.txt(有BSD sed和现代GNU sed)
  • sed -r '/^(A).*(lorem)$/d' file.txt

答案 1 :(得分:2)

$ sed '/^A.*lorem$/d' file.txt
  • ^A:以A
  • 开头
  • .*:中间的东西
  • lorem$:以lorem
  • 结尾

答案 2 :(得分:1)

删除括号。

使用您的代码,相应的单行成为 -

sed '/^A.*lorem/d' file.txt

如果你想要更加严谨,你可以看看詹姆斯的答案更正确地终止了正则表达式 -

sed '/^A.*lorem$/d' file.txt

两者都有效。