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

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

我想 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

最后,我使用-vget 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

相关内容