Как добавить СЛУЧАЙНУЮ строку во все вхождения другой строки в файле - PullRequest
1 голос
/ 09 февраля 2012

Я пытаюсь написать bash-скрипт, который бы изменял все вхождения определенной строки в файле.

У меня есть файл с кучей текста, в котором встречаются URL.Все URL-адреса имеют следующий формат: http://goo.gl/abc23 (это goo.gl/, за которым следуют 4 или 5 алфавитно-цифровых символов).

Я хотел бы добавить строку ко всем URL-адресам.Мне удалось (с помощью пользователя Дэн Фего ) сделать это с помощью sed, но это работает только путем добавления статической строки.

Я ищу способ добавления различной строки к каждому вхождению .Допустим, у меня есть функция generatestring, которая каждый раз отображает новую строку.Я хотел бы добавить разные сгенерированные строки для каждого URL.http://goo.gl/abc23 станет http://goo.gl/abc23?GeneratedString1, http://goo.gl/JB007 станет http://goo.gl/JB007?GeneratedString2 и так далее.

Кто-нибудь знает, можно ли это сделать?Мне сказали, что Perl - это путь, но у меня нет опыта работы с Perl.Вот почему я спрашиваю здесь.

Заранее благодарен за любую помощь.

Ответы [ 4 ]

2 голосов
/ 09 февраля 2012

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;
}
1 голос
/ 09 февраля 2012

Если 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
1 голос
/ 09 февраля 2012

Вы можете сделать это на многих языках, но в 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.txt
0 голосов
/ 10 февраля 2012

Это может работать для вас:

gs(){  echo $(tr -cd '[:alnum:]' </dev/urandom | head -c5); }
export -f gs
cat <<\! file
> http://goo.gl/abc23
> http://goo.gl/JB007
> bunch of text http://goo.gl/qwert another bunch of text
> another bot http://goo.gl/qwert another bot http://goo.gl/qaza
!
sed '\|http://goo\.gl/[0-9a-zA-Z]\{4,5\}\>|{s//&?'\''$(gs)'\''/g;s/^/echo '\''/;s/$/'\''/}' file |
sh
http://goo.gl/abc23?0Az23
http://goo.gl/JB007?ugczB
bunch of text http://goo.gl/qwert?LDW27 another bunch of text
another bot http://goo.gl/qwert?U9my2 another bot http://goo.gl/qaza?Ybtlp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...