как я должен использовать системную команду в Perl - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу заменить строку на $ var.У runnew есть

input= input/old/should/change;
replace= input/old/replace;
other = input/old/other;
replace_other= input/old/replace_other;

Мой выходной файл должен выглядеть следующим образом:

 input= input/old/should/New;
replace= input/old/New_replace;
other = input/old/New_other;
replace_other= input/old/New_replace_other;

Я хочу заменить «input =» на input = input / old / should / New;Я использовал как,

if ($#ARGV != 0) {
    die "\n********USAGE <cellname> <tech>********\n"; 
}
$newinput=$ARGV[0];
open(my $fh, "$runnew") or die "Could not open rerun.txt: $!";
while (<$fh>) {
 system ( sed -i "/input=.*/c\input= $newinput" $runnew );
}

Но появляется ошибка «Скаляр обнаружил там, где ожидался оператор в run.pl» и отображает строку sed и спрашивает «(Отсутствует оператор перед $ runnew?)».Когда я использовал тот же sed на терминале, он заменил линию.

Пожалуйста, кто-нибудь может указать, где ошибка?

Да Использовать Sed просто, но у меня есть файл с разными строками, и каждая строка должна быть заменена.Пожалуйста, позвольте мне знать, если у вас есть идея получше, чем эта.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Почему вы вообще хотите звонить sed?Ваше требование может быть намного проще обработано непосредственно в Perl:

  • добавьте -i.bak для включения режима замены на месте
  • используйте первый параметр командной строки в качестве строки замены
    • удалите его из массива @ARGV, чтобы он не интерпретировался как файл
  • зацикливание всех файлов в командной строке
    • чтение строка за строкой
    • применить подстановку
    • результат печати

Perl автоматически позаботится об открытии файлов, записи в правильный файл и переименовании старых файлов в .bak.

#!/usr/bin/perl -i.bak
use warnings;
use strict;

my($replacement) = shift(@ARGV);

while (<>) {
    s/input=.*/input= $replacement/;
    print;
}

exit 0;

Тестовый прогон (принимая обоснованное предположение о ваших входных данных):

$ cat dummy1.txt.bak 
input= test1
input= test2
$ cat dummy2.txt.bak 
input= test3
input= test4

$ perl dummy.pl REPLACEMENT dummy1.txt dummy2.txt

$ cat dummy1.txt
input= REPLACEMENT
input= REPLACEMENT
$ cat dummy2.txt
input= REPLACEMENT
input= REPLACEMENT

или использовать содержимое файла "rerun.txt":

$ perl dummy.pl REPLACEMENT $(cat rerun.txt)
0 голосов
/ 25 февраля 2019

system() принимает список строк в качестве аргумента.Вам нужно заключить в кавычки команду, которую вы передаете.

system ( "sed -i '/input=.*/c\input= $newinput' $runnew" );

Но ваш код все еще выглядит очень странно.Вы запускаете точно такую ​​же команду sed для каждой строки во входном файле.Это то, что ты хотел сделать?

Не совсем понятно, что ты здесь пытаешься сделать.Но я уверен, что лучший подход будет включать , а не с использованием sed и использованием Perl для ваших преобразований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...