如何防止sed命令覆盖原文件并输出新文件?

如何防止sed命令覆盖原文件并输出新文件?

UPPER.txt文件中,我需要用非大写的APPLEand替换and 。我还需要保留旧文件,并生成一个新文件。我使用以下命令:ORANGEappleorangeUPPER.txtlower.txt

sed 's/APPLE/apple/g' UPPER.txt > lower.txt
sed 's/ORANGE/orange/g' UPPER.txt > lower.txt

但问题是,我运行上述命令后UPPER.txt,结果lower.txt变成了包含非大写项目的相同内容。我希望UPPER.txt保持原样。

使用 sed 后如何保留原始文件的备份?因为我想在 C++ 中使用此命令来system(command)操作文件,所以我希望将所有命令写在一行中,然后我可以将其作为字符串传递给系统命令。

答案1

我觉得你有一些误解。

sed命令只将结果输出到bash中,与原始文件无关,>操作者只将结果写入文件。

但是,如果您愿意,可以选择-i编辑原始文件。-i选项附带备份后缀(可选)。

$ cat UPPERCASE.txt 
APPLE
$ sed 's/APPLE/apple/g' UPPERCASE.txt
apple
$ sed 's/APPLE/apple/g' UPPERCASE.txt > lowercase.txt
$ cat UPPERCASE.txt 
APPLE
$ cat lowercase.txt 
apple
$ sed 's/APPLE/apple/g' -i[BACKUP] UPPERCASE.txt 
$ cat UPPERCASE.txt 
apple
$ ls
UPPERCASE.txt UPPERCASE.txt[BACKUP] lowercase.txt

这里的[BACKUP]文件是原始文件。

答案2

您提到的命令 sed 's/APPLE/apple/g' UPPER.txt > lower.txt不应该覆盖原始文件UPPER.txt,因为sed的默认行为是写入lower.txt。您还执行了其他操作,可能覆盖了原始文件。sed除非您提供标志,否则不会触碰原始文件-i。为了您的目的,我建议首先备份原始文件,也就是复制它。

附注:请注意,system()通话是有点邪恶不应该使用

相关内容