我正在尝试编写一个bash脚本,它将修改文件中某个字符串的所有出现。
我有一个包含大量文本的文件,其中会出现urls。所有urls都采用以下格式:http://goo.gl/abc23(即goo.gl/,后面是4个或5个字母数字字符)。
我想做的是在所有urls中追加一个字符串。我设法(在用户Dan Fego的帮助下)用sed完成了这个任务,但是它只能通过附加一个静态字符串来工作。
我要寻找的是一种将不同的字符串附加到每个事件的方法。假设我有一个函数generatestring,它每次都会回显不同的字符串。我想在每个url中添加一个不同的生成字符串。http://goo.gl/abc23会变成http://goo.gl/abc23?GeneratedString1,http://goo.gl/JB007会变成http://goo.gl/JB007?GeneratedString2等等。
有没有人知道这是否能办到?有人告诉我,perl是可行的,但我对perl没有任何经验。所以我才在这里问。
提前感谢您的帮助。
发布于 2012-02-09 15:57:04
如果在每一行中URL并不是单独的,您可以这样做:
#!/usr/bin/perl
use strict;
use warnings;
sub generate {
my $i = shift;
return "GeneratedString$i";
}
my $i = 0;
while(my $line = <>) {
$line =~ s~(http://\S+)~$1 . "?" . &generate($i++)~eg;
print $line;
}使用:
test.pl file_to__modify输出:
http://goo.gl/abc23?GeneratedString1
http://goo.gl/JB007?GeneratedString2发布于 2012-02-09 15:49:04
ETA:假设URL嵌入到其他文本中:
$ perl -lnwe 's#http://goo.gl/\w{5}\K\b# "?" . rand(100) #ge; print' googl.txt例如:
$ cat googl
random text here, and perhaps some html <a href="http://goo.gl/abc23">
more stuff http://goo.gl/abc23 foo fake link http://foo.bar/abc12
longer http://goo.gl/abc23123123 foo fake link http://foo.bar/abc12
$ perl -lnwe 's#http://goo.gl/\w{5}\K\b# "?" . rand(100) #ge; print' googl
random text here, and perhaps some html <a href="http://goo.gl/abc23?69.998515">
more stuff http://goo.gl/abc23?26.186867532985 foo fake link http://foo.bar/abc12
longer http://goo.gl/abc23123123 foo fake link http://foo.bar/abc12-l chomps文件并向print. -n添加换行符,在脚本周围添加一个while(<>)循环,这基本上意味着它要么从参数文件名读取,要么从STDIN读取。\K的意思是“保持匹配的文本”,\b是单词边界,因此不匹配部分字符串。
请注意,它仍然与http://goo.gl/abc12/foo匹配,但由于我不知道您的数据是什么样子,您必须确定哪些边界是可以接受的。
当然,rand(100)只是作为您打算使用的任何函数的占位符。
如果您需要脚本版本,下面是退出代码:
use strict;
use warnings;
BEGIN { $/ = "\n"; $\ = "\n"; }
while (<>) {
chomp;
s[http://goo.gl/\w{5}\K\b]['?' . rand(100);]eg;
print;
}发布于 2012-02-09 15:43:04
您可以在许多语言中这样做,但在Perl中,它非常直接:
#!/usr/bin/perl
use strict;
use constant MAX_RANDOM_STRING_LENGTH => 5;
my $regex_url = '(http://goo.gl/\w{5})';
my @alphanumeric = ("A".."Z", "0".."9");
my $random_cap = $#alphanumeric + 1;
sub generate_string
{
my $string = "?";
for (my $i = 0; $i < MAX_RANDOM_STRING_LENGTH; $i++)
{
$string .= $alphanumeric[int(rand($random_cap))];
}
return $string;
}
my @input = <>;
for(@input)
{
my $cur = $_;
while ($cur =~ /$regex_url/)
{
$cur = $';
my $new_url = $1 . generate_string();
s/$1/$new_url/g;
}
}
print(@input);用法:
script_name.pl < input.txt > output.txthttps://stackoverflow.com/questions/9213719
复制相似问题