如何从文本文件中删除字符串并保存为同一文件?

时间:2014-06-10 18:53:40

标签: bash

我试图编写一个bash函数来从文本文件中删除垃圾字符串(包括引号和括号),并使用相同的文件名重新保存文件。

当我将其保存为新文件时,我得到了它...

function fixfile()
{
sed 's/(\"garbagestringhere\")//g' /Users/peter/.emacs.d/recent-addresses > /Users/peter/.emacs.d/recent-addresses-fixed;
}

...但是当我使用与以前相同的文件名保存它时,它会擦除​​文件:

function fixfile()
{
sed 's/(\"garbagestringhere\")//g' /Users/peter/.emacs.d/recent-addresses > /Users/peter/.emacs.d/recent-addresses;
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

对于GNU sed man sed将显示-i选项:

-i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

如果您使用的是OSx(或BSD),则可以使用(see this reference answer

sed -i '' 's/whatever//g' file
//    ^ note the space

答案 1 :(得分:1)

即使在您的特定情况下,我建议使用 sed -i
在更一般的方法中,您可以考虑使用 sponge 来自moreutils。

sed '...' file | grep '...' | awk '...' | sponge file
  

Sponge读取标准输入并将其写入指定文件。与shell重定向不同,海绵在打开输出文件之前会吸收其所有输入。这允许限制读取和写入同一文件的管道。   如果未指定输出文件,则海绵输出到stdout

(来自here的Git,或来自here ...)

或者,您可以在退出功能之前使用删除的临时文件。 带有随机(或伪随机)namefile 的临时文件。