【发布时间】:2012-12-26 01:23:43
【问题描述】:
我正在尝试在 HP-UX 中进行递归查找和替换,但遗漏了一些东西。
我现在拥有的:
find . -name "*.java" | xargs sed 's/foo/bar/g'
知道问题在于它没有替换内联文件。我相信在其他操作系统上有一个 -i 标志,但在我的 HP-UX 版本中似乎没有。
有什么建议吗?
【问题讨论】:
我正在尝试在 HP-UX 中进行递归查找和替换,但遗漏了一些东西。
我现在拥有的:
find . -name "*.java" | xargs sed 's/foo/bar/g'
知道问题在于它没有替换内联文件。我相信在其他操作系统上有一个 -i 标志,但在我的 HP-UX 版本中似乎没有。
有什么建议吗?
【问题讨论】:
find . -name "*.java" | xargs sed -i 's/foo/bar/g'
或
find . -name "*.java" | xargs perl -pi -e's/foo/bar/g'
【讨论】:
find -print0 和 xargs -0 来解决这个问题,但 -0 不适用于 Solaris 上的 xargs ,我认为 -print0 也不适用于 find 。
在文件上运行您喜欢的任何工具并“就地”更改它们(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、cut 等任何您喜欢的方法:
find . -name "*.java" |
while IFS= read -r file; do
grep "whatever" "$file" > tmp && mv tmp "$file"
done
唯一不起作用的是名称包含换行符的文件,但find | xargs 解决方案也不会按原样处理,如果你有它们,你应该重命名它们。
【讨论】: