2013-01-11 133 views
1

我試圖在HP-UX中執行遞歸查找和替換,但缺少一些內容。Unix HP-UX ksh遞歸查找和替換

我在看什麼:

find . -name "*.java" | xargs sed 's/foo/bar/g' 

知道的問題是,它不是替換文件內聯。我相信其他操作系統有一個-i標誌,但在我的HP-UX版本中似乎沒有。

有什麼建議嗎?

+0

請點擊此處:http://theunixshell.blogspot.com/2012/12/find-and-replace-string-in-all-files.html – Vijay

+0

另請參閱超級用戶:http://superuser.com/q/532573/4714 –

回答

2
find . -name "*.java" | xargs sed -i 's/foo/bar/g' 

find . -name "*.java" | xargs perl -pi -e's/foo/bar/g' 
+0

如上所述,-i標誌不適用於我的sed版本。然而第二個選擇工作。謝謝。 – RobM

+0

即使在我的solaris上-i也不可用於sed.so我也使用perl.but在整體上它是sed替換的唯一方法。 – Vijay

+1

請注意,對於包含空格(或其他字符)的文件名,上述操作將失敗。你需要使用'find -print0'和'xargs -0'來解決這個問題,但是-0在Solaris上的xargs中不可用,我不認爲-print0可以用於查找。 –

1

簡單,便攜的解決方案來運行你的文件喜歡的任何工具,並改變他們「就地」(SED -i在後臺使用一個tmp文件太)只是:

find . -name "*.java" | 
while IFS= read -r file; do 
    sed 's/foo/bar/g' "$file" > tmp && mv tmp "$file" 
done 

您可以使用SED,grep的,砍這種方法,不管你喜歡:

find . -name "*.java" | 
while IFS= read -r file; do 
    grep "whatever" "$file" > tmp && mv tmp "$file" 
done 

唯一不起作用的是其名稱中包含換行符的文件,但find | xargs解決方案原樣不變,您應該重命名這些文件,無論如何您都有這些文件。