grep不从文件中获取模式

时间:2012-01-14 18:11:19

标签: linux grep

我有一个模式文件,比如 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移植的窗口中正常工作。

我错过了什么吗? 任何帮助表示赞赏,因为这让我很头疼:( 谢谢!

2 个答案:

答案 0 :(得分:4)

它应该正常工作(它适用于我)。 -f开关由POSIX指定。

你说它在Windows上运行的事实给了我一个想法:可能是t.txt文件以DOS换行结束吗?我尝试了一个干净的文件(没有新行),它工作。然后我尝试用DOS文件,我能够重现你的结果。

尝试dos2unix来“修复”DOS文件。

答案 1 :(得分:1)

如果您没有dos2unix实用程序,则可以执行以下任一操作将DOS或Windows换行符转换为Unix换行符。

  1. 此单行假设所有行以CR+LF结尾(回车+换行)

    sed -i 's/.$//' filename
    
  2. 您通常可以先在命令行输入^M控件字符,方法是先按Ctrl-v(控制键+ v键),然后按Ctrl-m。      sed -i's / ^ M $ //'filename

  3. 以下单行假设我们使用的是GNU sed。 CR的十六进制值为0x0D。

    sed -i 's/\x0D$//' filename