我在Cent OS7上编写了一个bash脚本。现在我需要使用sed
删除所有不包含.jpg
或.jpeg
的行。
sed不能匹配0或1次
这里是我的脚本:
sed -i -e '/\.jp(e)?g/!d' myfile
但它会删除所有的行,这意味着预期这是行不通的。
但是,如果我做或sed -i -e '/\.jpeg/!d' myfile
。他们两人都很好。
我在Cent OS7上编写了一个bash脚本。现在我需要使用sed
删除所有不包含.jpg
或.jpeg
的行。
sed不能匹配0或1次
这里是我的脚本:
sed -i -e '/\.jp(e)?g/!d' myfile
但它会删除所有的行,这意味着预期这是行不通的。
但是,如果我做或sed -i -e '/\.jpeg/!d' myfile
。他们两人都很好。
捕获组(()
)和量词?
(匹配前面的令牌0或1次)至少带有ERE(扩展RegEx),而不是BRE(基本RegEx)。
sed
默认情况下使用BRE,所以令牌被字面处理。
要启用ERE,使用-E
(或-r
如可用)sed
:
sed -E '/\.jp(e)?g/!d' myfile
捕获e
是在这里重复:
sed -E '/\.jpe?g/!d' myfile
需要注意的是,你可以使用ERE令牌从BRE逃脱他们与\
,所以下面也可以工作:
sed '/\.jp\(e\)\?g/!d' myfile
sed '/\.jpe\?g/!d' myfile
再一次,这看起来不像只使用一个选项即-E
那样干净。只有你想要这样的情况才是可移植性。
在sed
命令中使用正则表达式可能符合您的要求,零或一个'e'将按照以下所示过滤。
sed -i -e '/jpe\?g/!d' myfile
这可能为你工作(GNU SED):
sed '/\.jp\(e\|\)g/!d' file
使用交替,其中交替的一个是空的。
或许更容易地看到,如果交替列:
sed '/\.jpeg\|\.jpg/!d' file
然而,由于已经说明,使用?
:
sed '/\.jpe\?g/!d' file
注: *
是零个或多个即
sed '/\.jpe*g/!d' file
将允许.jpeeeeeeeeeeeeeeeeg