Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何从每个具有匹配文本的文件中删除行?_Linux_Unix_Ubuntu_Grep - Fatal编程技术网

Linux 如何从每个具有匹配文本的文件中删除行?

Linux 如何从每个具有匹配文本的文件中删除行?,linux,unix,ubuntu,grep,Linux,Unix,Ubuntu,Grep,正如您所看到的,当我编写代码时,我到处都在做console.log 现在,我想删除所有这些行。我不想手动进入每个文件来删除它们。相反,我想通过一个命令来完成它 类似于grep“console.log”*-R,我如何做同样的事情,但递归地删除这些行?(从我当前的目录中一路查看树下的每个文件)试一试 sed-i.bak'/console.log/d'*/*.js -i参数在位编辑文件。原始文件将在其名称后附加.bak,因此,如果出现问题或您改变主意,您可以恢复该文件 这不是一个正确的递归解决方案;

正如您所看到的,当我编写代码时,我到处都在做console.log

现在,我想删除所有这些行。我不想手动进入每个文件来删除它们。相反,我想通过一个命令来完成它

类似于
grep“console.log”*-R
,我如何做同样的事情,但递归地删除这些行?(从我当前的目录中一路查看树下的每个文件)

试一试

sed-i.bak'/console.log/d'*/*.js
-i
参数在位编辑文件。原始文件将在其名称后附加
.bak
,因此,如果出现问题或您改变主意,您可以恢复该文件

这不是一个正确的递归解决方案;您可能需要修改文件名通配符,或从
查找驱动命令-exec…
包装器使其递归。

在Perl中:

$ grep "console.log" * -R
account/db.js:        console.log(err);
account/db.js:        console.log(info);
account/db.js:                console.log(err);
account/db.js:                    console.log(err2);
account/controller.js:    console.log(covers);
account/controller.js:    console.log(req.api_user);
account/controller.js:    console.log(code);
account/controller.js:        console.log(user);
account/helper.js:                console.log(err);
messages/db.js:        console.log("Error " + err);
messages/helper.js:                console.log('No email notify.');
messages/helper.js:                console.log(msg_body);
messages/helper.js:                        console.log(message.sid);
messages/helper.js:                        console.log(message.dateCreated);
messages/helper.js:                        console.log(error);
products/controller.js:            console.log(product);
products/controller.js:                console.log(product);
products/helper.js:        console.log(data)
products/helper.js:    console.log('removing index....');
profile/db.js:                console.log(err);
profile/db.js:                console.log(info);
profile/db.js:                console.log(err);
profile/controller.js:                            console.log("sending phone confirmation text...");
profile/helper.js:            console.log(message.sid);
profile/helper.js:            console.log(message.dateCreated);
profile/helper.js:            console.log(error);
receiver/controller.js:    console.log(from);
receiver/controller.js:    console.log(body);
receiver/controller.js:        console.log(from_email);
receiver/controller.js:        console.log(to_id_gen);
receiver/controller.js:        console.log(finalbody);
receiver/controller.js:                            console.log(result);
reviews/db.js:        console.log(err);
reviews/db.js:        console.log(results);
reviews/controller.js:            console.log(review);
reviews/controller.js:    console.log(review_id);
search/controller.js:        console.log(JSON.stringify(data.hits.hits, null, 4));

尝试
查找此类内容。尝试
查找-类型f-exec sed-i'/console\.log/d'{}\
但您可能有兴趣使用
-i.bak
而不是保留备份副本的
-i
,这不是递归解决方案,@abasu:for recursion,您只需使用
zsh
sed-i'/console.log/d'***.js
glob pattern-比填充
find
更干净…那么我应该在控制台中键入什么呢?您所有的匹配项似乎都有一个子目录深;如果是这样,glob
*/*.js
应该在任何shell中都匹配它们。除非您的目录树非常深或非常复杂,否则您可能可以使用一组相当简单的通配符进行管理,而正确的递归解决方案是多余的。
find-name\*.js-type f-exec sed-i.bak'/console\.log/d'{}+
可能更有效。是的,从提供的示例开始,它看起来是这样的。但是我注意到在grep的任何地方,他都没有使用文件扩展名,或者没有提到只有*js文件是目标。所以我决定不做任何假设,跳过了-name选项。
perl -i -n -e'print unless /console\.log/' $(find . -name '*.js')