2013-06-21 6 views
2

Когда я использую «sed» в командной строке, он работает, но не включен в perl-скрипт.Команда SED не работает в скрипте perl

Примером может служить СЭД 's/\ s + // г' ааа> ГЭБ

но сказать, когда я пытаюсь вызвать ту же команду через PERL скрипт

$gf = `sed 's/\s\+//g' aaa > bbb` ; 

выходной файл остается таким же, как входной файл !!!! Пожалуйста, предложите.

+1

Можете ли вы привести полный пример, включающий скрипт perl и значения переменной 'aaa' - точно, как он вводится? Вы знаете, что '\ s +' не совпадает с '\ s \ +', правильно? – Floris

+0

http://stackoverflow.com/questions/918128/how-can-i-do-bulk-search-and-replace-with-perl – ctn

+0

спасибо..и думаю, следующий ниже приведен ниже, что я искал. – user2508758

ответ

4

В Perl, обратные кавычки имеют то же управляющий и интерполяцию правило, как строки в двойных кавычках: Обратный слэш формирования неизвестного кода побега забывает обратный слэш, например, "\." eq ".".

Таким образом, код Perl

print `echo \"1\"`; 
print `echo \\"1\\"`; 

выходы

1 
"1" 

Если вы хотите вставить, что sed команды в Perl, вы должны бежать обратный слэш, так что они даже достигают sh ELL:

$gf = `sed 's/\\s\\+//g' aaa > bbb`; 

На самом деле, вы не получите никаких вывод в $gf при перенаправлении вывода в файл. Мы могли бы просто сделать

use autodie; 

system "sed 's/\\s\\+//g' aaa > bbb"; 

или с одинарными кавычками:

use autodie; 

system q{ sed 's/\s\+//g' aaa > bbb }; 

который держит обратный слэш.

Тем не менее, это совершенно нереально, поскольку Perl может применить эту замену.

use autodie; # automatic error handling 

open my $out, ">", "bbb"; 
open my $in, "<", "aaa"; 
while (<$in>) { 
    s/\s\+//g; # remove all spaces followed by a plus 
    print {$out} $_; 
} 
+0

Спасибо, много amon .... я потратил впустую больше, чем 3 часа на это, и вы решили эту проблему за 1 минуту.Thanks alot alot – user2508758

+1

Вы имели в виду 'sed sed' или сделали typo sneak? Если не опечатка, можете ли вы объяснить, почему два 'sed' подряд? Помимо этого очень приятного и ясного решения! – Floris

+0

@Floris Спасибо, что нашли дубликаты. – amon

-2

у тебя

use strict; 
    use warnings; 

в верхней части файла?

вам может понадобиться кавычка, чтобы выполнить команду

$gf = `sed 's/\s\+//g' aaa > bbb`; 
0

В этих странных ситуациях я гарантирую, что у меня есть правильная команда. Я построить его, сохранить его, и вывод команды, так что я могу видеть то, что я создал:

my $command = '....'; 
print "Command is [$command]\n"; 
my $output = `$command`; 

Если вы работаете sed из Perl, вы можете делать это неправильно, так как Perl может уже сделать все что.