2013-01-11 75 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解决方案原样不变,您应该重命名这些文件,无论如何您都有这些文件。