2009-12-13 47 views

回答

16

重定向確實是打開文件進行寫入的第一件事,週四清除任何現有的內容。 sed然後嘗試讀取您剛創建的這個空文件,並且什麼都不做。該文件然後關閉,不包含任何內容。

1

您需要使用-i選項來編輯文件地點:

SED -i .bck的/ ABD/DEF/G'A.TXT

編輯:由尼爾指出,重定向首先打開文件進行寫入,從而清除它。

EDIT2:如果你想使用-i一個空的擴展,以防止備份文件的創建它可能對某些讀者

在OSX是有趣的,你需要以其他方式使用-e開關以及它失敗來解析參數正確:

的sed -e -i 'S/ABC/DEF/G' A.TXT

+0

錯誤,問題-提問者筆記一個文件被傳遞來讀取。另一個答案有正確的原因。 – 2009-12-13 09:29:20

8

重定向操作<,>等由shell處理。當您向包含重定向的shell發出命令時,shell將首先打開該文件。在>的情況下,文件將被打開寫入,這意味着它被截斷爲零大小。重定向文件打開後,shell會啓動一個新進程,將其標準輸入,輸出和錯誤綁定到任何可能的重定向文件,然後才執行您提供的命令。因此,當您的示例中的sed命令開始執行時,a.txt已被shell截斷。

順便說一句,有點切線,這也是你不能直接使用sudo重定向的原因,因爲它是需要打開重定向文件的權限,而不是正在執行的命令。

0

stdout和stderr會先準備好然後stdin再執行命令。所以a.txt首先會被stdout清除,然後當comamnd執行時不會找到任何內容。 嘗試 SED -i的/ ABD/DEF/G'A.TXT 或 的sed的/ ABD/DEF/G'1 A.TXT <> A.TXT

相關問題