Как заменить набор слов в файле другим набором в Perl? - PullRequest
3 голосов
/ 09 декабря 2008

Мое требование - заменить набор слов в данном текстовом файле вторым набором слов, который может быть задан из командной строки или другого файла. Желая использовать Perl для этого, так как остальная часть моего кода также на Perl.

Итак, если у меня есть следующее:

server name="${server1}" host="abc.com"
server name="${server2}" host="webcs.com"
server name="${server5}" host="httpvcs1.com"
server name="${server6}" host="xyz.com"
server name="${server7}" host="msg.com"

Я хочу заменить строки 'server1', 'server2', 'server5' и т. Д. Другим набором слов. Они могут быть помещены в другой файл или предоставлены из командной строки (в зависимости от того, что более возможно).

Кроме того, если вместо «сервер1», «сервер2» и т. Д. Я хочу заменить слово «сервер» словом «файл», как бы я сделал регулярное выражение для этой замены?

perl -pie 's/server\d{1-3}/myword/g' loginOut.txt > loginOut1.txt

Вышеприведенное заменит все слова на «myword». Но я хочу заменить только подстроку.

Ответы [ 6 ]

2 голосов
/ 09 декабря 2008

Регулярное выражение для вашего второго вопроса будет s/server/myword/g;. Это соответствует (и заменяет) любое вхождение "сервера".

Чтобы заменить server1, server2 и т. Д. Каждой строкой, у вас может быть текстовый файл, содержащий правило замены, например:

server1 abcd
server2 bcde
server3 cdef
etc.

Затем вы прочитаете дату из файла в хеш, например,

my %dict;
while(<DICTFILE>){
    /(\S+)\s+(\S+)/;
    $dict{$1}={$2};
}

и после этого приступить к замене:

while(my $line = <>){
    foreach my $s (keys %dict){
        $line =~ s/$s/$dict{$s}/g;
    }
    print $line;
}
1 голос
/ 09 декабря 2008

Вам просто нужно взять столько, сколько вам нужно, чтобы сделать его уникальным для вашей ситуации.

В этом случае вы можете сделать:

с / {/ сервер {файл / г;

1 голос
/ 09 декабря 2008

Все ответы выше имеют некоторые недостатки. Вы спросили какой-то способ

Я хочу заменить 'server1', 'server2', 'server5' и т. Д. На что-то вроде 'file1', 'file2', 'file5', ..

Команда для этого (в Windows выдает -pe, а не -pie):

perl -pe "s/\{server/\{file/g" in.txt > out.txt

и out.txt:

server name="${file1}" host="abc.com"
server name="${file2}" host="webcs.com"
server name="${file5}" host="httpvcs1.com"
server name="${file6}" host="xyz.com"
server name="${file7}" host="msg.com"

Я считаю, что это именно то, что вы хотели, основываясь на вашем последнем комментарии.

0 голосов
/ 09 декабря 2008

Вы можете попробовать Template Toolkit .


Вот выдержка из Template Toolkit Intro, Страница руководства :


Template Toolkit - это набор модулей Perl, которые реализуют быструю, гибкую, мощную и расширяемую систему обработки шаблонов. Чаще всего он используется для создания динамического веб-контента, хотя его можно одинаково хорошо использовать для обработки любых текстовых документов.

На простейшем уровне он обеспечивает простой способ обработки файлов шаблонов, заполняя ссылки на встроенные переменные их эквивалентными значениями. Вот пример шаблона.

Dear [% name %],

It has come to our attention that your account is in 
arrears to the sum of [% debt %].

Please settle your account before [% deadline %] or we 
will be forced to revoke your Licence to Thrill.

The Management.

По умолчанию директивы шаблонов встроены в последовательности символов [% ... %], но вы можете изменить эти и другие параметры, чтобы настроить внешний вид, ощущения и работу Template Toolkit. Вы можете установить параметр INTERPOLATE, например, если вы предпочитаете встраивать переменные в стиле Perl:

Dear $name,

It has come to our attention that your account is in 
arrears to the sum of $debt.

Страница Perldoc

0 голосов
/ 09 декабря 2008

Попробуйте следующее:

$what = 'server'; # The word to be replaced
$with = 'file';   # Replacement
s/(?<=\${)$what(?=[^}]*})/$with/g;
0 голосов
/ 09 декабря 2008

Измените свое регулярное выражение на следующее:

perl -pie 's/\{server/myword/g' loginOut.txt > loginOut1.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...