Bash正则表达式

时间:2011-11-16 10:09:51

标签: regex bash

如何删除当前目录中的所有文件 - 但不删除标题中1.65的文件?

我尝试用

捕获这些文件
*[^1][^\.][^6][^5]*
*[^\(1\.65\)]*

(可以按Alt-*展开正则表达式)

但它不起作用。这是一个实验代码:

touch foo1.65bar \#bla1.66 qbit0.65t 1.65boris notRelated@All 

3 个答案:

答案 0 :(得分:4)

将find用于此类工作通常更加可靠和富有表现力:

find -mindepth 1 -maxdepth 1 '(' -type f -and -not -name '*1\.65*' ')' -delete

答案 1 :(得分:3)

您可以使用extended globbing ..(bash 4)

touch a b c foo1.65bar foo1_65bar
ls  
echo ======
shopt -s extglob
rm !(*1.6*)
ls  

输出

a  b  c  foo1_65bar  foo1.65bar
=====
foo1.65bar

答案 2 :(得分:0)

你可以在Ruby,Python,Perl等文件名上使用下面的正则表达式。然后你必须用所选语言编写一个小脚本或一个班轮来完成这项工作。它使用负向前瞻。 (CFR)。 Lookahead and Lookbehind Zero-Width Assertions

^((?!1\.65).)*$

如果要构建与特定字符串不匹配的正则表达式,则不能使用[],因为它指定了单个字符,而不是按顺序指定所有字符。你必须使用环绕构造。