如何在我的.html文件下的任何地方重命名该单词而不使用perl中的File :: Find?

时间:2017-05-15 07:25:07

标签: perl

以下是我的查询,以下是我的目录结构。

`-- ka
    |-- ka.html
    `-- ka_tal
        |-- tal_cation
        |   |-- tal_cation.html
        |   `-- ev1
        |       `--ka_ka_tal_tal_cation_v1.html
        |
        `-- ka_tal.html

这里每个.html文件都有一个名为tevision的单词我要将所有单词tevision重命名为ev.so我尝试过以下代码。但它不适用于我。

 finddepth(sub {

  return unless -d;

  (my $new = $_) =~ s/tevision/ev/ or return;
  rename $_, $new or warn "Err renaming $_ to $new in $File::Find::dir: $!";
}, ".");

如何使用perl重命名.html文件中的所有单词?

2 个答案:

答案 0 :(得分:2)

在File :: Find调用的子例程中,$_变量将包含已找到的文件的名称。您的代码似乎认为它将包含该文件的内容。要获取文件的内容,您需要打开文件并阅读内容。然后,您需要进行转换并将更改的内容写回原始文件。

使用Unix find命令和Perl的命令行选项的组合可以轻松得多。可能有助于为单个文件计算解决方案,然后使用find在所有必需文件上执行该命令。

$ perl -i -pe 's/tevision/ev/' some_file.html

这需要一个文件(some_file.html),打开它并处理文件。

  • -i:这会将转换后的输入写回原始文件
  • -p:这循环遍历文件中的所有行。反过来,每一个都存储在$_中,并且在每次循环迭代后打印$_的内容。
  • -e:这是您要为文件的每一行运行的代码。

然后我们可以将它放入find命令中以获得您想要的完整行为。

$ find . -name "*.html" -exec perl -i -pe 's/tevision/ev/' {} \;

以下内容效率更高,因为它们不会启动perl的多个实例:

$ find . -name "*.html" -exec perl -i -pe 's/tevision/ev/' {} +   # Requires GNU find

$ find . -name "*.html" -print0 | xargs -0 perl -i -pe 's/tevision/ev/'

答案 1 :(得分:1)

试试这个

my $path = "ka/";
find($path);
sub find{
    my ($s) = @_;
    foreach my $ma (glob "\Q$s\E/*")
    {
      if(-f $ma && $ma =~ m/\.html\z/)
      {
        system('perl', '-i', '-pe', 's/tevision/ev/', '--', $ma);
      }
      elsif(-d $ma)
      {
        find($ma)
      }

    }
}