Imk*_*kls 3 regex unix bash 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
但不知怎的,它不起作用,它显示整个文件,我无法弄清楚为什么.
有谁可以帮助我吗?
其他人给了你正确的解决方案,但没有解释为什么你的正则表达式不起作用.该()肯定是无用的,但如果你已经使用其他工具/语言的正则表达式,你很可能会不得不预期的结果.
它不起作用,sed因为它默认使用POSIX的基本正则表达式,其中分组的字符是\(和\),(而且)将匹配文字字符.输入文本中没有这样的括号,因此不匹配.
如果你已经用你的正则表达式会工作GNU的sed -r或BSD的sed -E,标志切换到POSIX的扩展正则表达式,其中(并)用于分组和\( \)匹配字面括号.
总之,以下命令将执行相同的操作:
sed '/^A.*lorem$/d' file.txtsed -r '/^(A).*(lorem)$/d' file.txt (使用GNU sed)sed -E '/^(A).*(lorem)$/d' file.txt (使用BSD sed和现代GNU sed)sed '/^\(A\).*\(lorem\)$/d' file.txt$ sed '/^A.*lorem$/d' file.txt
^A:以 A.*:中间的东西lorem$: 以。。结束 lorem