我有数百个包含数千行的文件,我需要删除一些跟随模式的行,所以我用正则表达式去了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
但不知何故它不起作用,它显示整个文件,我无法弄清楚原因。
有人能帮助我吗?
答案 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
两者都有效。