正则表达式不匹配

正则表达式不匹配

为什么这不匹配..?

sed -e '/--Updated?[[:space:]]+Date/d' inputfile

这..:

--Updated Date: 2013-11-06 15:32:13

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

用于移除?我也试过了\s,不行。

答案1

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

sed -r '/--Updated?[[:space:]]+Date/d' inputfile

更新答案

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

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

表达式里面有2个正则表达式。

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

? - optional

+- 一次或多次。

因此,命令 sed 将删除与 --updated 匹配的每一行以及一个或多个空白字符和日期,但由于 ?字符 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

答案2

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

sed '/--Updated*[[:space:]][[:space:]]*Date/d' inputfile

不幸的是,没有真正的替代品?,因此*使用 a 也可以匹配多个ds。然而+,可以通过简单地重复模式 an 来替换,*第二次重复使用 a 。

更新

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

sed \'
  /--Updated[[:space:]][[:space:]]*Date/d
  /--Update[[:space:]][[:space:]]*Date/d
  ' inputfile

答案3

使用 cygwin 上的 gnu sed 4.2.2,添加-r标志:

 '--Updated Date: 2013-11-06 15:32:13'|sed -r -e '/--Updated?[[:space:]]+Date/d'

不打印任何输出。 -r打开扩展正则表达式 so?并将+像您期望的那样工作。这扩展正则表达式参考我使用最多的点是,在基本正则表达式(默认)中?必须+有一个前导反斜杠才能具有其特殊含义。

相关内容