【问题标题】:replacing a string in all file in perl in windows在windows的perl中替换所有文件中的字符串
【发布时间】:2013-07-13 04:54:25
【问题描述】:

我想在 windows 的所有文件中用另一个字符串替换一个字符串。 所有具有相同扩展名的文件。 我尝试使用 perl one liner 命令,但似乎“*”不适用于 windows。

perl.exe -pi.bak -e "s/Hello/ABCD/ge" C:\Users\Jamimb\Desktop\Test\*.tmp

所以请帮忙。

【问题讨论】:

  • 我怀疑在 Linux 中等效的工作,因为命令解释器 shell 在程序执行之前将带有 * 的任何文件名扩展为实际文件名的列表。它在 Windows 中可能不起作用,因为不会发生这种 * 的通配符扩展。
  • @Paul:在windows中还有什么方法可以代替*?
  • 如果从 cygwin 或其他一些 shell 而不是通常的 dos 命令行运行,perl 可能会表现得更好。 cygwin.com
  • 在尝试之前,请检查您的 perl 是否会修改单个文件。如果它不会修改您命名的单个文件,则修复 *. 没有意义
  • @Paul:“表现得像 Linux” 不是 “表现得更好” 的同义词。 Linux 有很多优点,但任何看起来像文件 glob 的参数在您查看之前就已为您展开,这不是其中之一。

标签: regex windows perl


【解决方案1】:

您可以在 Perl 中使用 glob 显式扩展命令行参数。

此外,在这种情况下,替换上的 /e ("eval") 修饰符是错误的。如果strict 存在,则会导致Bareword not allowed 错误,但如果没有它,它只是一个空操作,因为ABCD 评估为'ABCD'

试试这个

perl -i.bak -pe "BEGIN{@ARGV = map glob, @ARGV} s/Hello/ABCD/g" C:\Users\Jamimb\Desktop\Test\*.tmp

【讨论】:

  • 非常感谢..以上适用于同一目录中的文件。有没有办法替换子目录文件中的字符串?
  • 我不清楚你的意思。它将使用命令行参数中指定的任何目录。如果您传递多个参数,它还会扩展多个通配符表达式,例如perl ... path1/*.tmp path1/subdir/*.tmp
【解决方案2】:

你可以试试这个(也许):

for %f in (C:\Users\Jamimb\Desktop\Test\*.tmp) do perl.exe -pi.bak -e "s/Hello/ABCD/g" %f

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2011-10-11
    • 2017-01-10
    相关资源
    最近更新 更多