在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的结果与另一个变量结合起来的以下命令始终按预期工作?
答案 0 :(得分:1)
当你跑步时:
$ echo $(grep "FindMe" file_windows.txt)$SHELL
echo将打印包含FindMe的行,而该行又包含\ r \ n字符,以便$ SHELL 覆盖 FindMe \ r \ n。您可以通过将echo重定向到文件来轻松检查。
要解决此问题,您可以要求grep使用&#34;零字节&#34;来终止匹配字符串,这样:
$ echo $(grep -Z "FindMe" file_windows.txt)$SHELL
修改强>
我确实注意到你正在使用OSX。在这种情况下,请使用以下内容:
$ echo $(grep -o "FindMe" file_windows.txt)$SHELL
仅打印&#34;匹配字符串&#34;
答案 1 :(得分:0)
试试这个:
tr -d $'\r' < file_windows.txt > file_unix.txt
或
sed -e 's/\r$//' file_windows.txt > file_unix.txt
或者因为你在OsX上,你可以安装dos2unix
此致
克劳迪奥
答案 2 :(得分:0)
使用
echo "$(tr -d '\r' < file_windows.txt | grep FindMe)$SHELL"
我首先在echo参数周围加上双引号。看起来更好。
使用其他命令,您无法通过读取命令替换文件读取,您可以使用另一个命令
echo "$(grep "FindMe" <(tr -d '\r' < file_windows.txt))$SHELL"
这里发生了什么?
我首先在echo参数周围加上双引号。看起来更好。
您已经从stdin找到了tr命令:
tr -d '\r' < file_windows.txt
使用流程替换,您可以将某个流程的输出看作是另一个流程的文件。
您可以告诉grep从&#34;文件中读取&#34; tr -d '\r' < file_windows.txt
使用
grep "FindMe" <(tr -d '\r' < file_windows.txt)
将它们放在一起就会发出命令。
echo "$(grep "FindMe" <(tr -d '\r' < file_windows.txt))$SHELL"