SED删除带有REGEX模式的行

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
Run Code Online (Sandbox Code Playgroud)

我需要删除所有以" 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
Run Code Online (Sandbox Code Playgroud)

我做了正则表达式:

^(A).*(lorem)
Run Code Online (Sandbox Code Playgroud)

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

在UNIX shell中

sed '/^(A).*(lorem)/d' file.txt
Run Code Online (Sandbox Code Playgroud)

但不知怎的,它不起作用,它显示整个文件,我无法弄清楚为什么.

有谁可以帮助我吗?

Aar*_*ron 7

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

它不起作用,sed因为它默认使用POSIX的基本正则表达式,其中分组的字符是\(\),(而且)将匹配文字字符.输入文本中没有这样的括号,因此不匹配.

如果你已经用你的正则表达式会工作GNU的sed -r或BSD的sed -E,标志切换到POSIX的扩展正则表达式,其中()用于分组和\( \)匹配字面括号.

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

  • sed '/^A.*lorem$/d' file.txt
  • sed -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


Jam*_*own 5

$ sed '/^A.*lorem$/d' file.txt
Run Code Online (Sandbox Code Playgroud)
  • ^A:以 A
  • .*:中间的东西
  • lorem$: 以。。结束 lorem