使用 negate ^ 得到不包含指定字符的结果

Abs*_*cDo 3 grep filenames

我想 grep 名称不包含的文件"^iX500"

$ cat note_list 
...
/Applications/ScanSnap Manual.localized/iX500ScanSnapManual.app/Contents/Resources/manual/basic/EN/ix500/images_mac/EvernoteMark.png
/Applications/ScanSnap 
Run Code Online (Sandbox Code Playgroud)

我试过

 cat note_list | grep -i "^iX500"
 #not return results
Run Code Online (Sandbox Code Playgroud)

$ cat note_list | egrep -i "^(iX500)"
#not return result
Run Code Online (Sandbox Code Playgroud)

最后,我使用-vget it done

cat note_list | egrep -i -v "(iX500)"
Run Code Online (Sandbox Code Playgroud)

但我怎么能^在 grep 中使用否定呢?

Kus*_*nda 7

grep使用on 文件名的问题是它grep是一个面向行的工具,文件名可能包含换行符。

假设文件中的所有文件名都没有换行符,那么您将使用grep -v否定匹配感:

grep -iF -v 'iX500' <note_list
Run Code Online (Sandbox Code Playgroud)

我添加了它-F,因为它是我们匹配的字符串而不是正则表达式。

^在内部用于匹配不在特定集合中的[...]单个字符。例如,将匹配给定范围内非小写字母的单个字符(假设标准 POSIX 语言环境)。当在其他地方使用时,表示字符串的开头,因此,eg在行的开头匹配字符串(同样,仅在行的末尾匹配字符串)。[^a-z]^^alphaalpha alpha$

我认为您正在寻找的是制作一个匹配“not iX500”的正则表达式。问题是您的示例中的大多数字符串都会匹配。例如,Applications(示例中的两行)的位是“not iX500”。

以下提取不包含字母 的所有行X

grep '^[^X]*$'
Run Code Online (Sandbox Code Playgroud)

X在您的情况下[^X]*,您必须想出一个与整行匹配但与任何地方的单词都不匹配的正则表达式,而不是“not”iX500表达式。

grep使用 GNU并使用具有前瞻/后瞻功能的 PCRE 表达式可能以某种方式实现,但是先匹配iX500然后用 ​​否定匹配的意义要容易得多-v