【问题标题】:Unix HP-UX ksh recursive find and replaceUnix HP-UX ksh 递归查找和替换
【发布时间】:2012-12-26 01:23:43
【问题描述】:

我正在尝试在 HP-UX 中进行递归查找和替换,但遗漏了一些东西。

我现在拥有的:

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

知道问题在于它没有替换内联文件。我相信在其他操作系统上有一个 -i 标志,但在我的 HP-UX 版本中似乎没有。

有什么建议吗?

【问题讨论】:

标签: unix sed find ksh hp-ux


【解决方案1】:
find . -name "*.java" | xargs sed -i 's/foo/bar/g'

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

【讨论】:

  • 如前所述,-i 标志不适用于我的 sed 版本。然而,第二个选项奏效了。谢谢。
  • 即使在我的 solaris 上 -i 也无法用于 sed。所以我也使用 perl。但总的来说,这是 sed 进行就地替换的唯一方法。
  • 请注意,对于包含空格(或某些其他字符)的文件名,上述操作将失败。您需要使用 find -print0xargs -0 来解决这个问题,但 -0 不适用于 Solaris 上的 xargs ,我认为 -print0 也不适用于 find 。
【解决方案2】:

在文件上运行您喜欢的任何工具并“就地”更改它们(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 解决方案也不会按原样处理,如果你有它们,你应该重命名它们。

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 2018-11-10
    • 2011-10-23
    • 2023-03-25
    • 2013-05-26
    • 1970-01-01
    • 2016-08-21
    • 2012-01-11
    相关资源
    最近更新 更多