正则表达式与bash中的文件路径不匹配

时间:2014-09-04 03:32:21

标签: regex bash

我花了很长时间试图弄清楚为什么这个正则表达式与以下名称的文件不匹配:

/var/tmp/app.0.attachments 
.... 
/var/tmp/app.11.attachments

sudo rm -rf /var/tmp/app/\.([0-9]{1}|1[0-1]{1})/\.attachments
$: -bash: syntax error near unexpected token `('

我已尝试转义[]|{}

请帮忙。

2 个答案:

答案 0 :(得分:3)

尝试

sudo rm -rf /var/tmp/app.{0..11}.attachments

答案 1 :(得分:0)

正则表达式不适用于shell。贝壳做圆滑,这更简单,而不是那么强大。使用默认的globbing,您可以做的最好的事情是:

sudo rm -rf /var/tmp/app/app.[0-9]*.attachments

如果启用扩展通配符,则可以添加管道并将其分组到工具集。

shopt -s extglob
sudo rm -rf /var/tmp/app/app.@([0-9]|1[0-1]).attachments

请注意不同的语法。它不是正则表达式,但它是相似的。从bash(1)手册页:

  

如果使用shopt内置启用 extglob shell选项,则会识别多个扩展模式匹配运算符。在以下描述中,模式列表是由|分隔的一个或多个模式的列表。可以使用以下子图案中的一个或多个来形成复合图案:

     
?(pattern-list)
       Matches zero or one occurrence of the given patterns
*(pattern-list)
       Matches zero or more occurrences of the given patterns
+(pattern-list)
       Matches one or more occurrences of the given patterns
@(pattern-list)
       Matches one of the given patterns
!(pattern-list)
       Matches anything except one of the given patterns

另一种选择是使用find,它可以同时执行globbing和regex。

sudo find /var/tmp -regex '/var/tmp/app\.\([0-9]\|1[0-1]\)\.attachments' -delete
sudo find /var/tmp -regex '/var/tmp/app\.\([0-9]\|1[0-1]\)\.attachments' -exec rm -rf {} +

请注意,它会在整个路径上执行匹配,而不仅仅是文件名。您还必须转义\(\)\|