我有一个模式文件,比如 t.txt ,包含以下内容:
vali
和我要运行grep的文件,比如 a ,包含以下内容:
validate
validate:
bw_validate:
[echo] Validating project: CrossService_v1_59_5_1
[echo] Found 62 errors and 28 warnings
[echo] -----------------------------------------------------------------
[echo] Validating project: CRM-UDB_59_4_2
[echo] Found 25 errors and 28 warnings
[echo] -----------------------------------------------------------------
[echo] Validation Failed: At least one project contains errors.
notify:
BUILD FAILED
bw.xml:311: Validation Failed: At least one project contains errors.
如果我执行:
grep -iE vali a
我得到了预期的输出,即:
validate
validate:
bw_validate:
[echo] Validating project: CrossService_v1_59_5_1
[echo] Validating project: CRM-UDB_59_4_2
[echo] Validation Failed: At least one project contains errors.
bw.xml:311: Validation Failed: At least one project contains errors.
但如果我执行:
grep -iE -f t.txt a
我没有得到任何匹配。 文件是可读的,并且都在同一目录中(我从中执行命令)。 我尝试了-f和--file = t.txt, - file ='t.txt', - file =“t.txt”
我在Linux Fedora 16 64bit上。奇怪的是,相同的命令在使用grep / egrep移植的窗口中正常工作。
我错过了什么吗? 任何帮助表示赞赏,因为这让我很头疼:( 谢谢!
答案 0 :(得分:4)
它应该正常工作(它适用于我)。 -f
开关由POSIX指定。
你说它在Windows上运行的事实给了我一个想法:可能是t.txt
文件以DOS换行结束吗?我尝试了一个干净的文件(没有新行),它工作。然后我尝试用DOS文件,我能够重现你的结果。
尝试dos2unix
来“修复”DOS文件。
答案 1 :(得分:1)
如果您没有dos2unix
实用程序,则可以执行以下任一操作将DOS或Windows换行符转换为Unix换行符。
此单行假设所有行以CR+LF
结尾(回车+换行)
sed -i 's/.$//' filename
您通常可以先在命令行输入^M
控件字符,方法是先按Ctrl-v
(控制键+ v键),然后按Ctrl-m
。

sed -i's / ^ M $ //'filename
以下单行假设我们使用的是GNU sed。 CR的十六进制值为0x0D。
sed -i 's/\x0D$//' filename