正则表达式不匹配

bra*_*ito 4 sed regular-expression

为什么这不匹配..?

sed -e '/--Updated?[[:space:]]+Date/d' inputfile
Run Code Online (Sandbox Code Playgroud)

这个..:

--Updated Date: 2013-11-06 15:32:13
Run Code Online (Sandbox Code Playgroud)

d?是因为有时我有Update Date,有时Updated Date

去除?我也试过\s,不行。

Ren*_*nte 7

您需要使用该-r参数。尝试使用

sed -r '/--Updated?[[:space:]]+Date/d' inputfile
Run Code Online (Sandbox Code Playgroud)

更新答案

当您使用 时sed '/something/d',与此匹配的每一行都将被删除。

-r - 参数 -r 是使用扩展的正则表达式。

表达式内部有 2 个正则表达式。

[[:space:]] - 匹配所有空白字符,包括换行符

? - optional
Run Code Online (Sandbox Code Playgroud)

+ - 一次或多次。

所以,命令 sed 将删除与 --updated 匹配的每一行,而不是一个或多个空白字符,而不是 Date 但因为 ? 字符 d 是可选的。喜欢:

--Updated Date: 2013-11-06 15:32:13
--Updated   Date: 2013-11-06 15:32:13
--Updated           Date: 2013-11-06 15:32:13
--Update Date: 2013-11-06 15:32:13
Run Code Online (Sandbox Code Playgroud)


Gra*_*eme 5

要使用 POSIX 基本正则表达式来做到这一点,我能得到的最接近的是:

sed '/--Updated*[[:space:]][[:space:]]*Date/d' inputfile
Run Code Online (Sandbox Code Playgroud)

不幸的是, 没有真正的替代品?,因此使用了 a*也可以匹配多个ds。的+但是可以通过简单地重复使用的图案被替换*为第2重复。

更新

实际上获得扩展表达式等效效果的方法是使用两种模式:

sed \'
  /--Updated[[:space:]][[:space:]]*Date/d
  /--Update[[:space:]][[:space:]]*Date/d
  ' inputfile
Run Code Online (Sandbox Code Playgroud)