Regex 与Grep不一致的结果
我正在浏览一些文件,查找字符串“host”(带单引号)。我想捕获包含字符串而不带注释(#)的文件 第一个例子中的测试用例工作得很好,但下面的第二个例子却不行。第二个案例是我创建的一个测试文件,并在其中插入了前导空格。所以我知道没有控制字符,只有空格 这两台服务器都是Linux的最新版本 第二个例子没有捕获文本的原因是什么?我知道我可以只为主机进行grep,然后用grep-v对评论进行过滤,但我不明白这一点,这让我很恼火Regex 与Grep不一致的结果,regex,grep,Regex,Grep,我正在浏览一些文件,查找字符串“host”(带单引号)。我想捕获包含字符串而不带注释(#)的文件 第一个例子中的测试用例工作得很好,但下面的第二个例子却不行。第二个案例是我创建的一个测试文件,并在其中插入了前导空格。所以我知道没有控制字符,只有空格 这两台服务器都是Linux的最新版本 第二个例子没有捕获文本的原因是什么?我知道我可以只为主机进行grep,然后用grep-v对评论进行过滤,但我不明白这一点,这让我很恼火 /home/user2> $ cat set.txt 'host
/home/user2> $ cat set.txt
'host'
/home/user2> $ grep -E "^\s+'host'" set.txt
'host'
另一台Linux服务器上的Grep未捕获所需数据:
[user1@wweb1 ~]$ cat set.txt
'host'
[user1@wweb1 ~]$ grep -E "^\s+'host'" set.txt
[user1@wweb1 ~]$
根据
grep
版本和类型,\s
可能不起作用。在我使用grep2.12的系统上,没有提到\s
,尽管它确实可以工作。其他版本可能未启用此功能
从手册页:
反斜杠字符和特殊表达式
符号\<和\>分别匹配
一个词的开头和结尾。符号\b与处的空字符串匹配
单词的边缘,并且\B与空字符串匹配,前提是它不是
在一个词的边缘。符号\w是[[:alnum:]和的同义词
\W是[^[:alnum:][]的同义词。
此外,mangrep | grep“\\\\s”
完全不返回任何内容。就是这样:没有提到\s
相反,您可以使用[:space:][/code>,如下所示:
user@pc $ grep -E "^[[:space:]]+'host'" set.txt
'host'
因此,请检查您的grep版本,并查找适用于所有版本的语法。说\s
在grep2.5.1中不起作用,但在2.6.3中起作用,所以如果你有一个2.6.3之前的版本,它可能不适用于\s
可能命令在不同的grep风格上有别名?你能检查一下吗?好问题。我运行了“set”和“env”,但没有任何内容出现别名。grep-V
为这两个grep命令报告相同的版本?我可以确认grep 2.5.1不起作用:echo'123'| grep-E'^\s+123'
没有给出匹配项,但是echo'123'| grep-E'^\s\s*123'
匹配项。因此,它似乎更像是一个“+”问题,而不是“\s”问题。六羟甲基三聚氰胺六甲醚。。。我的grep手册页还说\w
是[[:alnum:]
的同义词,\w
是[^[:alnum:]
的同义词,这是错误的。grep的版本是FreeBSD 11.4上的grep(GNU-grep)2.5.1-FreeBSD
。