正则表达式:不以“模式”开头


7

我的LIST文件中有很多行,并且只想列出名称不以(或包含)“git”开头的行。

到目前为止,我有:

cat LIST | grep ^[^g]

但我想要像:

#not starting by "git"
cat LIST | grep ^[^(git)]
#not containing "git"
cat LIST | grep .*[^(git)].*

但这不正确。我应该使用什么正则表达式?

Answers:


16

使用grep在这种情况下与-P选项,它解释图案作为一个Perl的正则表达式

grep -P '^(?:(?!git).)*$' LIST

正则表达式解释:

^             the beginning of the string
 (?:          group, but do not capture (0 or more times)
   (?!        look ahead to see if there is not:
     git      'git'
   )          end of look-ahead
   .          any character except \n
 )*           end of grouping
$             before an optional \n, and the end of the string

使用find命令

find . \! -iname "git*"

1
不确定如何/如果表达式将在内部进行优化,但我不会+在外部组上使用量词。考虑到它不会捕获它的匹配,我只需将它全部删除,以获得更简单/可读的表达式。
马里奥2013年

这个表达式匹配从开始到行结束任何不带启动git
HWND

你的第一个命令是我正在寻找的:)但是我不明白(?!git)的作用是什么?
Vulpo 2013年

这是一个负面的预测断言,请参阅更新的编辑。
2013年

7

由于OP正在寻找一般的正则表达式而不是专门用于grep,因此这是不以“git”开头的行的一般正则表达式。

^(?!git).*

分解:

^ 行的开头

(?!git) 没有跟着'git'

.* 后跟0个或更多字符


3

如果你想简单列出所有不包含git的行,试试这个

 cat LIST | grep -v git

在这种特定情况下,它确实有效。谢谢。但我更喜欢使用正则表达式,因为它可以在更多情况下使用(例如,解析用户输入的perl脚本)。
Vulpo 2013年

也许这篇关于SO的帖子有你需要的东西。
dinesh 2013年

几乎。我尝试匹配不包含字符串的内容。如果可能的话,不使用grep的“-v”选项:)
Vulpo 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.