erc*_*rch 11 linux grep bash regular-expression crunchbang
当我ls /directory | grep '[^term]'在 Bash 中执行时,我会得到一个常规列表,就好像该grep命令以某种方式被忽略了一样。我尝试了同样的事情egrep,我尝试将它与双引号和单引号一起使用,但没有更好的结果。当我尝试时,ls /directory | grep '^[term]我得到了以 term 开头的所有条目 - 正如预期的那样。
我已经在一个在线编辑器中尝试过这个命令,我可以在那里测试我的正则表达式并且它可以正常工作。但不是在 Bash 中。所以它在模拟中有效,但在现实生活中无效。
我在 Crunchbang Linux 10 上工作。我希望这是足够的信息,并期待每一个提示,因为未能在如此基本的级别上执行并浪费数小时的时间真的令人沮丧!
pra*_*k61 13
你确定你想要的正在发生吗?当您运行时,ls /directory | grep '[^term]'您实际上是在寻找字母术语。这意味着如果文件名中有其他字母,它仍然会出现在ls. 以以下目录为例:
$ ls
alpha brave bravo charlie delta
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行,ls |grep '^[brav]'我会得到以下信息:
$ ls |grep '^[brav]'
alpha
brave
bravo
Run Code Online (Sandbox Code Playgroud)
如您所见,不仅我得到了,brave而且bravo我得到了,alpha因为字符类[]将从该列表中获取任何字母。
因此,如果我运行,ls |grep '[^brav]'我将获得名称中任何地方不包含字符 brav 的所有文件。
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Run Code Online (Sandbox Code Playgroud)
如果您注意到它包含了整个目录列表,因为所有文件都至少有一个字母没有包含在字符类中。
因此,正如 Kanvuanza 所说,要对“术语”的倒数进行 grep,而不是t e r m您应该使用grep -v.
例如:
$ ls |grep -v 'brav'
alpha
charlie
delta
Run Code Online (Sandbox Code Playgroud)
此外,如果您不希望类中包含任何字符的文件使用grep -v '[term]'. 这将阻止任何包含这些字符的文件出现。(Kanvuanza 的回答)
例如:
$ ls |grep -v '[brav]'
Run Code Online (Sandbox Code Playgroud)
如您所见,没有列出任何文件,因为此目录中的所有文件都至少包含来自该类的一个字母。
附录:
我想补充一点,使用 PCRE 可以仅使用正则表达式来过滤使用否定表达式。要做到这一点,你会使用一些被称为负前瞻正则表达式:(?!<regex>)。
所以使用上面的例子,你可以做这样的事情来获得你想要的结果而不使用grep标志。
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
Run Code Online (Sandbox Code Playgroud)
要解构该正则表达式,它首先匹配一行的开头,^然后查找不匹配的字符串brav以进行后续操作。Only alpha, charlie, and deltamatch 所以这些是唯一被打印的。
| 归档时间: |
|
| 查看次数: |
37161 次 |
| 最近记录: |