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
,不行。
您需要使用该-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)
要使用 POSIX 基本正则表达式来做到这一点,我能得到的最接近的是:
sed '/--Updated*[[:space:]][[:space:]]*Date/d' inputfile
Run Code Online (Sandbox Code Playgroud)
不幸的是, 没有真正的替代品?
,因此使用了 a*
也可以匹配多个d
s。的+
但是可以通过简单地重复使用的图案被替换*
为第2重复。
实际上获得扩展表达式等效效果的方法是使用两种模式:
sed \'
/--Updated[[:space:]][[:space:]]*Date/d
/--Update[[:space:]][[:space:]]*Date/d
' inputfile
Run Code Online (Sandbox Code Playgroud)