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

How to overwrite the contents in the sed, without having backup file

我有这样的命令:

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

注释掉所有 console.log 语句。但是有两件事

  1. 它像 test.js-e 一样保留备份文件,我不想那样做。
  2. 说我想把同一个进程递归到文件夹,怎么办?

查看sed的帮助时,-i取了一个后缀作为备份,

-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)

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

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

至于递归,可以使用find-execxargs,请修改find​​命令并在运行之前测试exec

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

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

对于 2nd 部分,您可以尝试这样的操作:

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

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

从你原来的 post 我猜你只是想做一个 C 风格的注释,像这样:

/*

到双反斜杠样式,如:

//

对吧? 然后你可以用这个命令

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

请注意:

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

  • 如果你确实想做我推测的那样,请确保你应该转义字符 *,因为正则表达式 /* 的组合只是意味着匹配一个/ 出现一次或多次或 none 的模式,将匹配所有内容,非常危险 !