0

如何在指定文件中将 url 地址的结尾“.pl”更改为“.en”,将倒数第二个“.com”更改为“.org”

例如: http: //www.addres.pl 更改为: http://www.addres.en

如果存在这样的地址 http://www.addres.com.pl 更改为: http://www.addres.org.en

如果它看起来像这样 http://www.addres.com.ru 那么只需更改 .com http://www.addres.org.ru

文本文件输入示例:

http://www.addres.org.en
http://www.addres.com.pl
http://www.addre.pl
http://www.addres.en
http://www.addres.ru
http://com ddd http://www.com.pl.com.pl.com.pl.com.pl
aaa http://www.addres.com.pl! bbb
ccc (http://www.addre.pl) ddd

控制台输出示例:

http://www.addres.org.en
http://www.addres.org.en
http://www.addre.en
http://www.addres.en
http://www.addres.ru
http://com ddd http://www.com.pl.com.pl.com.pl.org.en
aaa http://www.addres.org.en! bbb
ccc (http://www.addre.en) ddd

现在我有这个来检查输入是否是一个文件

#!/usr/bin/perl
use warnings;
use strict;
use File::Find;

if (($#ARGV+1 != 1 )||(! -f $ARGV[0]))
{
  print "podaj plik\n";
  exit 1;
}

#!/usr/local/bin/perl
open (MYFILE, $ARGV[0]);
while (<MYFILE>) {
chomp;
my $url = $_;
for ($url) {
#s|(com)(.??)|org$2| and last;
s|com.pl|org.en| and last;
s|com[.]|org.| and last;
s|[.]pl|.en|; 
}
print "$url\n";
 }
close (MYFILE); 
exit 0;

怎么做

s|com[.]ru|org.ru| and last;

像这样更改所有地址

s|com[.]??|org.??| and last;

在哪里 ??可以是例如 ru,或 en 或所有其他,然后是 pl

4

1 回答 1

0

又快又脏:

use strict;
while (<>) {
    s|com[.]pl\b|org.en| or
        s|[.]pl\b|.en|   or
        s|com[.]ru\b|org.ru|;
    print;
}

注意正则表达式的顺序并从命令行调用它:perl script.pl in.txt.

然后学习使用文件句柄的词法变量打开文件的正确三参数方法(以防止名称与 MYFILE 一样常见的全局文件句柄相互破坏+当词法变量超出范围时关闭文件)。

添加:

查看您的新示例行,我认为您可能需要更多类似的东西(我在您上次编辑结束时包含了您要求的正则表达式):

while (<>) {
    s|com[.]pl([\s!)])|org.en\1| 
      or s|[.]pl([\s!)])|.en\1| 
      or s|com[.]([!pl])([\s!)])|org.\1\2| ;
    print;
}

如需进一步的建议,请阅读我下面的评论。

于 2013-05-06T18:01:13.763 回答