首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将随机字符串附加到文件中其他字符串的所有出现

如何将随机字符串附加到文件中其他字符串的所有出现
EN

Stack Overflow用户
提问于 2012-02-09 15:29:16
回答 4查看 407关注 0票数 1

我正在尝试编写一个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?GeneratedString1http://goo.gl/JB007会变成http://goo.gl/JB007?GeneratedString2等等。

有没有人知道这是否能办到?有人告诉我,perl是可行的,但我对perl没有任何经验。所以我才在这里问。

提前感谢您的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-09 15:57:04

如果在每一行中URL并不是单独的,您可以这样做:

代码语言:javascript
运行
复制
#!/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;
}

使用:

代码语言:javascript
运行
复制
test.pl file_to__modify

输出:

代码语言:javascript
运行
复制
http://goo.gl/abc23?GeneratedString1
http://goo.gl/JB007?GeneratedString2
票数 1
EN

Stack Overflow用户

发布于 2012-02-09 15:49:04

ETA:假设URL嵌入到其他文本中:

代码语言:javascript
运行
复制
$ perl -lnwe 's#http://goo.gl/\w{5}\K\b# "?" . rand(100) #ge; print' googl.txt

例如:

代码语言:javascript
运行
复制
$ 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)只是作为您打算使用的任何函数的占位符。

如果您需要脚本版本,下面是退出代码:

代码语言:javascript
运行
复制
use strict;
use warnings;

BEGIN { $/ = "\n"; $\ = "\n"; }
while (<>) {
    chomp;
    s[http://goo.gl/\w{5}\K\b]['?' . rand(100);]eg;
    print;
}
票数 2
EN

Stack Overflow用户

发布于 2012-02-09 15:43:04

您可以在许多语言中这样做,但在Perl中,它非常直接:

代码语言:javascript
运行
复制
#!/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);

用法:

代码语言:javascript
运行
复制
script_name.pl < input.txt > output.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9213719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档