如何在Perl替换脚本中引用变量?

时间:2011-10-03 11:29:57

标签: perl substitution

我正在编写一个Perl脚本,将一个目录中多个文件中的所有URL从camel case更改为小写。

e.g。从

   <a href="FooBar.html">

   <a href="foobar.html"> 

此测试替换正确地将所有网址重命名为foobartest.html:

   s/^<a href=\"(.*?)\"/<a href=\"foobartest.html\"/g

但是我很难通过变量$ 1引用实际的文件名。我正在尝试的一个例子:

   s/^<a href=\"(.*?)\"/<a href=\"\L$1\"/g

此替换只是将链接更改为。我错过了什么? 你可能会说我对Perl很新,所以任何指导都会非常感激。


用于读取目录中文件的完整脚本并替换(将其写为单行也不起作用,尽管其他替换工作通过一行):

#!/usr/bin/perl

use strict;
use warnings;

    chdir("/var/www/html/twiki_html") or die "$!";
    opendir (DIR, ".") or die "$!";
    my @files = grep {/.*?\.html/} readdir DIR;
    close DIR;
        {
        local @ARGV = @files;
        while(<>){
            s/^<a href=\""(.*?)\"/<a href=\"\L$1\"/g;
            }
        }

2 个答案:

答案 0 :(得分:1)

简单的单行:

perl -pwe 's/(?<=<a href=")([^"]+)(?=")/\L$1/' *.html

它不会改变任何东西,只显示更改。因此,当您满意时,可以将-i添加到选项中以对文件进行更改。请注意,更改是不可逆转的。使用-i.bak保留备份。 E.g:

perl -i.bak -pwe 's/(?<=<a href=")([^"]+)(?=")/\L$1/' *.html

答案 1 :(得分:0)

您的代码适合我。所以我想任何问题都必须出现在你没有向我们展示的代码中。

#!/usr/bin/env perl

use strict;
use warnings;

use 5.010;

$_ = '<a href="FooBar.html">';

s/^<a href=\"(.*?)\"/<a href=\"\L$1\"/g;

say;

运行它给出:

$ ./html_test
<a href="foobar.html">