如何在没有备份文件的情况下覆盖sed中的内容

时间:2015-02-03 07:36:29

标签: macos sed

我有这样的命令:

sed -i -e '/console.log/ s/^\/*/\/\//' *.js

会对所有console.log语句进行注释。但有两件事

  1. 它将备份文件保留为test.js-e,我不想这样做。
  2. 说我想将相同的进程递归到该文件夹​​,该怎么做?

3 个答案:

答案 0 :(得分:2)

在这种特殊情况下,您不必使用-e选项,因为它是不必要的。这将解决您的1st问题(因为-e似乎将作为-i选项的后缀)。

对于2nd部分,你可以尝试这样的事情:

for i in $(find . -type f -name "*.js"); do sed -i '/console.log/ s/^\/*/\/\//' $i; done;

使用find以递归方式查找所有.js个文件并进行替换。

答案 1 :(得分:0)

检查sed的帮助时,-i会使用后缀并将其用作备份,

  

-i [SUFFIX], - in-place [= SUFFIX]
                   编辑文件(如果提供SUFFIX,则进行备份)

并且输出备份似乎是samefile + -e这是你要发送的第二个参数,尝试删除空格并查看是否可行

sed -ie '/console.log/ s/^\/*/\/\//' *.js

至于递归,您可以将find-execxargs一起使用,请修改find​​命令并在运行exec之前对其进行测试

find -name 'console.log' -type f -exec sed -ie '/console.log/ s/^\/*/\/\//' *.js \;

答案 2 :(得分:0)

从你原来的帖子中我假设你只想做一个C风格的评论,如:

/*

采用双反斜杠式:

//

正确? 然后你可以用这个命令

来做
find . -name "*.js" -type f -exec sed -i '/console.log/ s#^/\*#//#g' '{}' \;

要注意:

  • 在sed中,分割字符通常为/,但如果您在替换或匹配字符串包含/时发现对Escape感到烦恼。您可以根据需要将拆分字符更改为#|,我发现它非常有用。

  • 如果你想做的就是我的假设,请确保你应该逃脱角色*,因为正则表达式/*的组合只是意味着匹配/的模式1}}出现一次或多次或一无所有,这将匹配所有内容,它非常危险