2012-03-27 73 views
3

我使用sed來搜索和替換文件中的兩個字符串在bash(GNU SED)爲什麼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的輸出,那麼我得到了正確的輸出。如果我重定向到一個新文件,一切正常。

回答

13

這是正常的。您無法讀取和寫入像這樣的管道中的同一文件。 (這將失敗與其他實用程序比sed)。

使用就地標誌-i代替:

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

接受指出**這將失敗,其他公用事業** – jperelli 2012-03-27 16:23:57

+0

@jperelli您將不得不接受而不是upvote :-) – brice 2012-03-27 16:26:51

+0

是的,根據stackoverflow,我等了5分鐘。謝謝! – jperelli 2012-03-27 16:31:28

3

sed以流的形式讀取文件並輸出流。只要在文件中執行重定向操作,內容將被覆蓋,並且由於該文件正在被讀取爲一個流,它甚至還沒有開始被sed讀取。當sed開始讀取文件時,它是空的,因此它立即結束而沒有輸出。

使用-i,做到就地編輯,而不是:

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

重定向打開文件的輸出,截斷它。這同時發生sed打開它的閱讀,所以sed看到截斷版本。您應該將輸出重定向到一個不同的文件,以避免重挫你的輸入,或者使用sed的就地編輯模式,而不是使用重定向:

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