结合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我发布的脚本将只对包含关键字的文件进行更改。我收到的错误消息与我在上面的评论中提到的相同。