grep命令不匹配另一个正则表达式的新行开头

时间:2017-09-10 17:52:41

标签: regex unix

我有这个内容的文件:

path=/nfs/location/alex 
path = /nfs/location/ 
alex/nfs/location 
/nfs/location/
# /nfs/location/
#alex /nfs/location
alex # d /nfs/location
/nfs/location

我想打印路径开头的所有行,但不包含#

  

/ NFS /位置/

在我的示例中,只有第3行不匹配

我写了unix commad:

grep -rE ([^#.*]|^[^0-9aA-zZ]/nfs/location/ .

但带#的行也会出现

3 个答案:

答案 0 :(得分:0)

尝试

grep -e "path\s?=\s?\/nfs\/location\/" test.txt

哪里\ s?表示允许任何空格字符中的零个或一个。

<强> EDITED 对不起,我没理解你的问题。 那么这是一个可能的解决方案:

grep -e "=\?\s\?\/nfs\/location\/"

答案 1 :(得分:0)

目前还不完全清楚您要匹配的是什么,但如果您只想匹配/nfs/location/前面有空格(\s),等号(=),或者线锚(^)的开头,您可以使用\s|=|^上的positive look-behind assertion,如下所示:

$ grep -P '(?<=\s|=|^)/nfs/location' file
path=/nfs/location/alex 
path = /nfs/location/ 
/nfs/location/

(注意,-P标志在grep中启用PCRE支持。)

修改(在评论澄清之后):要声明不在固定路径前[a-zA-Z0-9]范围内的字符,您可以使用negative look-behind assertion,如下所示:

$ grep -P '(?<![a-zA-Z0-9])/nfs/location' file
path=/nfs/location/alex 
path = /nfs/location/ 
/nfs/location/

答案 2 :(得分:0)

您希望选择带/nfs/location的行,并附加要求:
它应该在行的开头,或者非alnum字符必须在它前面。您可以在表达式中使用OR:

echo "path=/nfs/location/alex
path = /nfs/location/
alex/nfs/location
/nfs/location/" |
grep -E "(^|[^0-9a-zA-Z])/nfs/location"