为什么sed replace + redirection删除了我的文件?

时间:2012-03-27 16:10:49

标签: bash sed io-redirection

我使用sed搜索并替换bash文件中的两个字符串(GNU sed)

这是

之后的文件
-rw-r--r-- 1 websync www-data 4156 mar 27 12:56 /home/websync/tmp/sitio-oficial/sitios/wp-config.php

这是我运行的命令

sed 's/www-test/www/g' /home/websync/tmp/sitio-oficial/sitios/wp-config.php > /home/websync/tmp/sitio-oficial/sitios/wp-config.php

和结果

-rw-r--r-- 1 websync www-data 0 mar 27 13:05 /home/websync/tmp/sitio-oficial/sitios/wp-config.php

编辑:如果我没有重定向sed的输出,那么我得到了正确的输出。如果我重定向到一个新文件,一切正常。

3 个答案:

答案 0 :(得分:15)

这很正常。你不能在这样的管道中读写同一个文件。 (这将与sed之外的其他工具失败。)

改为使用就地标志-i

sed -i 's/www-test/www/g' /home/websync/tmp/sitio-oficial/sitios/wp-config.php

答案 1 :(得分:4)

sed将您的文件作为流读取并输出流。一旦您执行重定向到您的文件中的内容被覆盖,并且由于该文件正在被读取为流,它甚至还没有开始被sed读取。当sed确实开始读取文件时它是空的,所以它立即完成而没有输出。

使用-i进行就地编辑:

sed 's/www-test/www/g' -i /home/websync/tmp/sitio-oficial/sitios/wp-config.php

答案 2 :(得分:2)

重定向打开输出文件,将其截断。这与sed打开它以进行阅读同时发生,因此sed会看到截断的版本。您应该将输出重定向到另一个文件以避免破坏输入,或使用sed的就地编辑模式而不是使用重定向:

sed 's/www-test/www/g' -i /home/websync/tmp/sitio-oficial/sitios/wp-config.php