Windows 如何使grep忽略窗口换行符?

Windows 如何使grep忽略窗口换行符?,windows,bash,grep,line-endings,Windows,Bash,Grep,Line Endings,在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)$SH

在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忽略(窗口)换行符,以便将grep的结果与另一个变量组合在一起的以下命令始终按预期工作?

尝试以下操作:

tr -d $'\r' < file_windows.txt > file_unix.txt 
或者,因为您使用的是OsX,所以可以安装
dos2unix

问候

克劳迪奥

跑步时:

$ echo $(grep "FindMe" file_windows.txt)$SHELL
echo将打印包含FindMe的行,而FindMe又包含一个\r字符,因此$SHELL将覆盖FindMe\r。您可以通过将echo重定向到文件来轻松检查这一点

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

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

我注意到你正在使用OSX。在这种情况下,请使用以下各项:

$ echo $(grep -o "FindMe" file_windows.txt)$SHELL
要仅打印“匹配字符串”

请使用

echo "$(tr -d '\r' < file_windows.txt | grep FindMe)$SHELL"
echo“$(tr-d'\r'
我首先在echo参数周围加上双引号。看起来好多了。
对于不能通过读取命令来代替读取文件的其他命令,可以使用其他命令

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

echo“$(grep“FindMe”我知道这个命令。但是我想要实现的是,对于具有windows行结尾和unix文件结尾的文件,grep的输出是相同的(无需事先转换所有文件)。
echo "$(tr -d '\r' < file_windows.txt | grep FindMe)$SHELL"
echo "$(grep "FindMe" <(tr -d '\r' < file_windows.txt))$SHELL"
tr -d '\r' < file_windows.txt
grep "FindMe" <(tr -d '\r' < file_windows.txt)
echo "$(grep "FindMe" <(tr -d '\r' < file_windows.txt))$SHELL"