【问题标题】:How to make grep ignore windows line breaks?如何让 grep 忽略 Windows 换行符?
【发布时间】:2016-02-24 13:50:41
【问题描述】:

在 Mac OS X 上,我有一个带有 windows 换行符和以下内容的文件

$ file file_windows.txt 
file_windows.txt: ASCII text, with CRLF line terminators
$ cat file_windows.txt
IgnoreMe
FindMe

奇怪的是,当我使用 grep 匹配“FindMe”并将结果与​​另一个变量组合时,忽略了 grep 的结果:

$ echo $(grep "FindMe" file_windows.txt)$SHELL
/bin/bash

当我将文件转换为使用 unix 行尾时

tr -d '\r' < file_windows.txt > file_unix.txt 

然后突然我的 grep 命令与另一个变量结合使用

$ echo $(grep "FindMe" file_unix.txt)$SHELL
FindMe/bin/bash

如何让 grep 忽略 (windows) 换行符,以便将 grep 的结果与另一个变量组合的以下命令始终按预期工作?

【问题讨论】:

    标签: windows bash grep line-endings


    【解决方案1】:

    当你运行时:

    $ echo $(grep "FindMe" file_windows.txt)$SHELL
    

    echo 将打印包含 FindMe 的行,该行又包含一个 \r 字符,以便 $SHELL 将覆盖 FindMe\r。您可以通过将 echo 重定向到文件来轻松检查这一点。

    要解决此问题,您可以要求 grep 以“零字节”终止匹配字符串,这样:

    $ echo $(grep -Z "FindMe" file_windows.txt)$SHELL 
    

    编辑

    我确实注意到您使用的是 OSX。在这种情况下,请使用以下内容:

    $ echo $(grep -o "FindMe" file_windows.txt)$SHELL
    

    只打印“匹配字符串”

    【讨论】:

      【解决方案2】:

      试试这个:

      tr -d $'\r' < file_windows.txt > file_unix.txt 
      

      sed -e 's/\r$//' file_windows.txt > file_unix.txt 
      

      或者因为你在 OsX 上你可以安装 dos2unix

      问候

      克劳迪奥

      【讨论】:

      • 我知道这个命令。但是我想要实现的是grep的输出对于windows行结尾和unix文件结尾的文件是一样的(不需要事先转换所有文件)。
      【解决方案3】:

      使用

      echo "$(tr -d '\r' < file_windows.txt | grep FindMe)$SHELL"
      

      我首先在 echo 参数周围加上双引号。这样看起来更好。
      对于无法通过读取命令替换从文件读取的其他命令,您可以使用另一个命令

      echo "$(grep "FindMe" <(tr -d '\r' < file_windows.txt))$SHELL"
      

      这里发生了什么? 我首先在回声参数周围加上双引号。这样看起来更好。
      您已经找到从标准输入读取的 tr 命令:

      tr -d '\r' < file_windows.txt
      

      通过进程替换,您可以使某个进程的输出看起来像另一个进程的文件。 您可以告诉 grep 从“文件”tr -d '\r' &lt; file_windows.txt 中读取

      grep "FindMe" <(tr -d '\r' < file_windows.txt)
      

      将它们放在一起给出命令。

      echo "$(grep "FindMe" <(tr -d '\r' < file_windows.txt))$SHELL"
      

      【讨论】:

        猜你喜欢
        • 2019-09-10
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        相关资源
        最近更新 更多