Bash 中的正则表达式问题:[^negate] 似乎不起作用

Bash 中的正则表达式问题:[^negate] 似乎不起作用

当我ls /directory | grep '[^term]'在 Bash 中执行时,我得到一个常规列表,就好像该grep命令以某种方式被忽略一样。我尝试了同样的事情egrep,我尝试将它与双引号和单引号一起使用,但没有更好的结果。当我尝试时ls /directory | grep '^[term],我得到了所有以 term 开头的条目 - 正如预期的那样。

我已经在在线编辑器中尝试过这个命令,我可以测试我的正则表达式它发挥了应有的作用。但在 Bash 中则不然。所以它在模拟中有效,但在现实生活中却无效。

我在 Crunchbang Linux 10 上工作。我希望这是足够的信息,并期待着每一个提示,因为未能在如此基本的级别上执行并浪费数小时的时间确实令人沮丧!

答案1

你确定你想要的事情正在发生吗?当你跑步时,ls /directory | grep '[^term]'你本质上是在寻找字母术语 m。这意味着如果文件名称中包含其他字母,它仍然会出现在ls.以以下目录为例:

$ ls
alpha  brave  bravo  charlie  delta

现在,如果我运行,ls |grep '^[brav]'我会得到以下信息:

$ ls |grep '^[brav]'
alpha
brave
bravo

正如您所看到的,我不仅得到了,brave而且bravo我还得到了,alpha因为角色类[]将从该列表中获取任何字母。

因此,如果我运行,ls |grep '[^brav]'我将获得所有不包含字符 brav 的文件任何地方在名字里。

$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta

如果您注意到它包含整个目录列表,因为所有文件至少有未包含在字符类中的字母。

正如 Kanvuanza 所说,要 grep 查找“术语”的反义词而不是字符,t e r m您应该使用grep -v

例如:

$ ls |grep -v 'brav'
alpha
charlie
delta

另外,如果您不希望文件在类中包含任何字符,请使用grep -v '[term]'.这将阻止任何包含这些字符的文件出现。 (坎万扎的回答)

例如:

$ ls |grep -v '[brav]'

正如您所看到的,没有列出任何文件,因为该目录中的所有文件至少包含该类中的一个字母。

附录:

我想补充一点,使用 PCRE 可以仅使用正则表达式来过滤掉使用否定表达式的内容。为此,您可以使用称为负向前看正则表达式的东西:(?!<regex>)

因此,使用上面的示例,您可以执行类似的操作来获得您想要的结果,而无需使用grep标志。

$ ls | grep -P '^(?!brav)'
alpha
charlie
delta

为了解构该正则表达式,它首先匹配行的开头^,然后查找不匹配的字符串brav。只有alphacharliedelta匹配,因此这些是唯一被打印的。

答案2

我想那个grep -v标志可以满足你的要求。来自手册页:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.

您可以用来ls /directory | grep -v [term]打印任何不匹配的行。

相关内容