Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么grep会匹配所有的行,不管是什么模式_Regex_Bash_Grep - Fatal编程技术网

Regex 为什么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时遇到问题。 我有一个文件,我想检查某些模式。当我试图搜索它时,grep返回所有的行,前提是模式已经存在于给定的文件中

为了进一步解释,这是我正在运行的代码

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字符代码),可能还有其他我没有想到的代码。