Regex 为什么grep会匹配所有的行,不管是什么模式
我在使用grep时遇到问题。 我有一个文件,我想检查某些模式。当我试图搜索它时,grep返回所有的行,前提是模式已经存在于给定的文件中 为了进一步解释,这是我正在运行的代码Regex 为什么grep会匹配所有的行,不管是什么模式,regex,bash,grep,Regex,Bash,Grep,我在使用grep时遇到问题。 我有一个文件,我想检查某些模式。当我试图搜索它时,grep返回所有的行,前提是模式已经存在于给定的文件中 为了进一步解释,这是我正在运行的代码 grep -F "ENVIRO" "$file_pos" >> blah 无论我尝试做什么,即使我提供了一整行作为模式,bash总是返回所有行。 以下是我正在尝试的变化: grep -F "E20" "$file_pos" >> blah grep E20 "$file_pos" >
grep -F "ENVIRO" "$file_pos" >> blah
无论我尝试做什么,即使我提供了一整行作为模式,bash总是返回所有行。以下是我正在尝试的变化:
grep -F "E20" "$file_pos" >> blah
grep E20 "$file_pos" >> blah
grep C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah
grep -F C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah
此外,由于一些奇怪的原因,当向grep添加-x选项时,它不会返回任何行,尽管存在确切的模式
我在网上和bash文档中搜索了原因,但没有找到任何东西
我的最终测试如下
grep -F -C 1 "E20" "$store_pos" >> blah #store_pos has the same value as $file_pos
我想可能是打印结果后的线条,但事实并非如此。
我正在使用blah文件查看输出。
我也在使用Linux mint rebecca。
最后,尽管命名很熟悉,但这个问题与
最后,我想说我是bash的新手。
我怀疑错误可能是由于主文件而不是代码造成的
file
,wc-l
grep
:哪个grep
重定向输出,或使用|more
或|less
重定向输出,以免被先前添加的尝试所迷惑编辑:看起来您的文件有错误的行尾(可能是旧的Mac OS(
CR
)。如果您有dos2unix
,您可以尝试将它们转换为Unix样式的行尾(LF
)。我目前无法访问PC,但有什么可能帮助您排除故障:
1.使用grep--color-F查看它是否匹配正确。
2.在您的语句之后,使用| cat-A查看是否有任何令人惊讶的控制字符,行应以$结尾,任何其他字符,如\I或\M,有时都会令人头痛
我怀疑第2个问题,因为它似乎是Windows输出。在这种情况下,您可以使用cat filename | dos2unix | grep stmt解决它
是否将dos2unix输出另存为一个文件?
只需再次检查该文件,它应该类似于以下内容:
[root@pro-mon9001 ~]# cat -A Test.txt
Windows^M$
Style^M$
Files^M$
Are^M$
Hard ^M$
To ^M$
Parse^M$
[root@pro-mon9001 ~]# dos2unix Test.txt
dos2unix: converting file Test.txt to Unix format ...
[root@pro-mon9001 ~]# cat -A Test.txt
Windows$
Style$
Files$
Are$
Hard$
To$
Parse$
现在它应该正确地解析了——所以只需验证它是否正确地转换了文件
祝你好运!从注释中可以看出,文件中有分隔行的回车符,而不是
grep
所期望的换行符;因此,grep
将文件视为一个大行,可以匹配,也可以不匹配
(注意:关于如何在“纯文本”文件中分隔行,至少有三种不同的约定——unix使用换行符(\n
),DOS/Windows使用换行符,后跟换行符(\r\n
),而MacOS的OSX之前版本只使用换行符(\r
)
我不清楚您的文件是如何以这种格式结束的,但您可以通过以下方式轻松修复:
tr '\r' '\n' <badfile >goodfile
tr'\r'\n'goodfile
或者在飞行中:
tr '\r' '\n' <badfile | grep ...
tr'\r'\n'您正在追加blah
。截断为空的部分在哪里?类似于grep-F C:\E20-II\ENVIRO\SSNHapACS480.dll“$file\u pos”
无法工作,如果您希望将反斜杠传递给grep,则需要对其进行转义或引用。因此:grep-F'C:\E20-II\ENVIRO\SSNHapACS480.dll'$file\u pos“
。这可以与-x
组合使用。但是这个问题应该有相反的效果:你应该没有匹配项,而不是每一行都匹配?检查hextump或cat-vET文件名
。显然,如果我使用wc-l,我得到的计数为0,我从安装日志中生成了我正在搜索模式的文件,然后我在文件上使用grep并生成了问题中的文件,即将输出放入文件中。没有换行是因为文件来自安装日志还是来自grep?文件的值是多少?如果这是一个空字符串,则所有行都将匹配。由于每行以^M结尾,这是否意味着格式为mac?我尝试过dos2unix,但没有改变任何内容。^M表示回车,这是Windows文件的典型格式。因此,可能首先运行dos2unix filename将其转换为*nix样式,然后重试您的语句。您的系统上可能也没有安装dos2unix,这使两步过程成为一个很好的测试。我确实使用了dos2unix,但这没有帮助。换行计数仍然为0。更新了答案-只是从文件中删除了^M个控制字符。请查看我对wc-l的评论,并且我使用的是正确的grep,即/bin/grepIf如果您的dos2unix>=7.1,您可以检查换行符。$dos2unix-i HxAcciCa.htm 369 125 0 no_bom text HxAcciCa.htm在我看来,该文件有369个DOS换行符、125个Unix换行符和0个Mac换行符。如果您不小心将文件转换为Mac换行符,请使用mac2unix命令将其转换回Unix格式谢谢您解决了此问题。有一个问题是,为什么cat将“\r”读作^M而不是“\r”?@user1544624:表示非打印字符有许多不同的约定\r
(用于“Return”)是C语言约定,使用相当广泛。您可能遇到的其他代码包括^M
(因为回车符在ASCII代码中是Control-M)、
(回车符)、\015
(八进制的ASCII字符代码),可能还有其他我没有想到的代码。