grep:输入文件“ X”也是输出


12

我使用ubuntu 14.4,并尝试将grep命令的输出重定向到文件,但我不断收到此错误:

grep: input file 'X' is also the output

我已经搜索了这个问题,才发现这是一个错误,ubuntu 12.4并且没有任何描述,有人可以帮助我解决这个问题吗?

我运行以下命令:

grep -E -r -o -n r"%}(.*){%" > myfile

如果您正在尝试,grep pattern file > file那么它将无法正常工作。您不能将相同的文件用作grep的输入和输出。
jimmij 2014年

我添加我的命令!感谢您的提示,但是当我尝试在其他路径中使用文件时,它并不能作为前提,而我不能这样做!
卡斯拉夫德2014年

例如使用../fi即可获取bash: ../f.txt: Permission denied
Kasramvd 2014年

显示完整命令,您的输入文件是什么,或者您正在使用管道?
jimmij 2014年

1
现在,我了解到您实际上是递归地对整个目录结构进行遍历,并希望将结果附加到该结构中已经存在的文件中。问题在于,shell(bash,zsh等)首先执行重定向,然后才返回命令(在此示例中为grep)。这意味着grepin命令中grep pattern file > file已经看到了空文件,因此没有任何输入。但是,如果使用>>而不是,>则文件不为空,但是grep仍然会引发错误,因为它可能导致一次又一次地递归处理同一行(模式)。
jimmij 2014年

Answers:


9

不能使用与输入和输出相同的文件grep。您可以考虑以下替代方法:

  • 临时文件

    grep pattern file > tmp_file
    mv tmp_file file
    
  • sed

    sed -i -n '/pattern/p' file
  • 将整个文件放在变量中(对于大文件不是一个好主意)

    x=$(cat file); echo "$x" | grep pattern > file

1
SED可以更便携sed -i '/pattern/!d' file
科斯塔

但在OP想要的情况下sed -i -n 's/.*\(pattern\).*/\1/p' file
Costas 2014年

@Costas,您是对的,该问题已编辑,并添加了其他信息,因此您也可以sed完善语法。
jimmij 2014年

5

您可以--excludegrep命令中使用该字段,如下所示:

grep  --exclude=myfile  -Eron  r"%}(.*){%"  >  myfile

2
确保myfile唯一,因为它仅适用于文件的基本名称。您不想跳过其他目录中具有相同名称的文件。
Walf

1

我在bash中找到了一种方法: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

in中的命令<<<"..."将首先执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.