我正在编写一个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;
}
}
答案 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">