结合grep-v和grep-r?

结合grep-v和grep-r?,grep,Grep,我想从给定目录中的所有文件中删除整行文本。我知道我可以使用grep-vfoo filename一次处理一个文件。我知道我可以使用grep-rfoo递归地搜索目录。如何组合这些命令以从目录中的所有文件中删除给定的文本行 试试以下方法: grep -vlre 'foo' . | xargs sed -i 's/pattern/replacement/g' 细分: grep: -v 'Inverse match' -l 'Show filename' -r 'Search recursi

我想从给定目录中的所有文件中删除整行文本。我知道我可以使用
grep-vfoo filename
一次处理一个文件。我知道我可以使用
grep-rfoo
递归地搜索目录。如何组合这些命令以从目录中的所有文件中删除给定的文本行

试试以下方法:

grep -vlre 'foo' . | xargs sed -i 's/pattern/replacement/g'
细分:

grep:
  -v 'Inverse match'
  -l 'Show filename'
  -r 'Search recursively'
  -e 'Extended pattern search'

xargs: For each entry perform

sed -i: replace inline 

查找文件的UNIX命令名为
find
,而不是
grep
。忘记你曾经听说过的
grep-r
,因为这只是一个坏主意,下面是查找文件并对其执行某些操作的正确方法:

find . -type f -print | xargs sed -i '/badline/d'

我认为这是可行的:

grep-ilre'Foo'xargs sed-i“扩展”“Foo/d”

其中,
“扩展名”
指文件名的添加。它将以您指定的扩展名复制原始文件,修改后的文件将具有原始文件名。我添加了-I,以防您要求它不区分大小写

修改后的文件1变为“文件1” 原始文件1变为“文件扩展”


其中一个回答表明,OSX中较新版本的
sed
-i
选项略有不同,因此需要添加一个扩展。该文件被解释为命令,这就是您看到该错误的原因

grep-rvfoo目录
我建议使用sed@jlhonora这可以工作,但只将所有内容打印到终端,不会覆盖实际文件。@Sandeep您知道sed与grep-v的等价物是什么吗?我在这里查看了()但找不到它。@Sandeep这在单个文件的基础上工作:
sed's/regexp/replacement/g'inputFileName>outputFileName
,但我不知道如何跨文件目录执行此操作。但是如果您只想编辑不包含特定关键字的文件,该怎么办?这就是我从问题中理解的,这就是为什么我建议
grep-rv
这几乎有效,但我得到以下错误
sed:1:“./hr1_14_.nex”:无效的命令代码。
其中hr1_14_.nex是我要在其中搜索的文件名。这里有一个指向测试文件的链接,以便可以重新创建错误。我想删除包含“alligator_Mississippinesis”的整行代码。将
-I
更改为
-I”“
,因为您显然使用的是需要
-I
在后面加一个arg(OSX?)的sed@jlonora我发布的脚本将只对包含关键字的文件进行更改。我收到的错误消息与我在上面的评论中提到的相同。