我想 grep 名称不包含的文件"^iX500"
$ cat note_list
...
/Applications/ScanSnap Manual.localized/iX500ScanSnapManual.app/Contents/Resources/manual/basic/EN/ix500/images_mac/EvernoteMark.png
/Applications/ScanSnap
我试过
cat note_list | grep -i "^iX500"
#not return results
和
$ cat note_list | egrep -i "^(iX500)"
#not return result
最后,我使用-v
get it done
cat note_list | egrep -i -v "(iX500)"
但我怎么能^
在 grep 中使用否定呢?
答案1
使用 on 文件名的问题grep
是它grep
是一个面向行的工具,文件名可能包含换行符。
假设文件中的所有文件名都没有换行符,那么您将使用grep -v
否定匹配感:
grep -iF -v 'iX500' <note_list
我添加了它,-F
因为它是我们匹配的字符串而不是正则表达式。
^
内部使用来[...]
匹配单个字符不是在一个特定的集合中。例如,[^a-z]
将匹配给定范围内非小写字母的单个字符(假设标准 POSIX 语言环境)。当在其他地方使用时,^
表示字符串的开头,以便eg^alpha
匹配字符串alpha
仅有的在行的开头(同样,alpha$
仅匹配行末尾的字符串)。
我认为您正在寻找的是制作一个匹配“not iX500
”的正则表达式。问题是您的示例中的大多数字符串都会匹配。例如, Applications
(示例中的两行)的位是“not iX500
”。
以下提取不包含字母 的所有行X
:
grep '^[^X]*$'
在您的情况下,您必须想出一个匹配的正则表达式,而不是“not X
”表达式[^X]*
整条线但它与任何地方的单词都不匹配iX500
。
使用 GNU 并使用具有前瞻/后瞻功能的 PCRE 表达式可能以某种方式实现,但是先匹配然后用 否定匹配的意义grep
要容易得多。iX500
-v