为什么grep匹配所有行,无论模式如何

use*_*624 6 regex bash grep

我在使用grep时遇到问题.我有一个文件http://pastebin.com/HxAcciCa,我想检查某些模式.当我试图搜索它时,grep会返回所有行,前提是该模式已存在于给定文件中.

为了解释更多,这是我正在运行的代码

grep -F  "ENVIRO" "$file_pos" >> blah    
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,即使我提供整行作为模式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
Run Code Online (Sandbox Code Playgroud)

同样由于某些奇怪的原因,在向grep添加-x选项时,尽管存在确切的模式,但它不会返回任何行.

我搜索了网络和bash文档的原因,但找不到任何东西.

我的最终测试如下

grep -F -C 1  "E20" "$store_pos" >> blah #store_pos has the same value as $file_pos
Run Code Online (Sandbox Code Playgroud)

我想也许是在结果后打印线条但事实并非如此.我正在使用blah文件来查看输出.我也在使用Linux薄荷丽贝卡.最后虽然命名很熟悉但这个问题与grep为什么匹配模式"\"的所有行都不相似

最后我想说我是bash的新手.我怀疑错误可能是由于主文件http://pastebin.com/HxAcciCa而不是代码?

Gor*_*son 3

从注释来看,该文件似乎有回车符来分隔行,而不是grep预期的换行符;结果,grep将文件视为一大行,整个文件要么匹配,要么不匹配。

(注意:关于如何在“纯文本”文件中分隔行,至少存在三种不同的约定——unix 使用换行符 ( \n),DOS/Windows 使用回车符后跟换行符 ( \r\n),以及 OSX 之前版本的 MacOS仅使用回车符 ( \r)。)

我不清楚你的文件是如何以这种格式结束的,但你可以通过以下方式轻松修复它:

tr '\r' '\n' <badfile >goodfile
Run Code Online (Sandbox Code Playgroud)

或即时使用:

tr '\r' '\n' <badfile | grep ...
Run Code Online (Sandbox Code Playgroud)

  • @user1544624:有许多不同的约定来表示非打印字符。`\r`(“Return”)是 C 语言约定,使用相当广泛。您可能遇到的其他字符包括“^M”(因为回车符在 ASCII 代码中是 Control-M)、“&lt;CR&gt;”(用于回车符)、“\015”(八进制的 ASCII 字符代码),可能还有其他的我不是随手想到的。 (2认同)