Как передать переменный номер строки в команде sed substitute - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь выполнить sed операцию, подобную этой

sed -i '100s/abc/xyz/' filename.txt

Я хотел 100 в переменной скажем $ var из сценария perl.Итак, я пытаюсь вот так

system("sed -i "${vars}s/abc/xyz/" filename.txt"). 

Это выдает какую-то ошибку.

Опять же, когда я делаю так, помещая системную команду в одинарные кавычки:

system('sed -i "${vars}s/abc/xyz/" filename.txt')

это подставляет неправильно.Что можно сделать?

Ответы [ 2 ]

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

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

Почему бы просто не сделать это в нативном perl, что значительно более эффективно.Perl даже позволяет вам выполнять редактирование на месте, если хотите.

Но это так же просто, как:

open ( my $input, '<', 'filename.txt'); 
open ( my $output, '>', 'filename.txt.new'); 

select $output; 
while ( <$input> ) {
   if ( $. == $vars ) { 
       s/abc/xyz/
   }
   print;
 }

Или, если вы действительно заинтересованы в редактировании на месте, вы можете посмотретьв настройку `$ ^ I:

Perl для редактирования на месте внутри скрипта (а не для одной строки)

Но я бы предложил« просто »переименовать файл послеВы сделали так же просто.

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

Лучше и безопаснее использовать вариант LIST system, поскольку он позволяет избежать небезопасного анализа командной строки оболочки.Команда, sed в вашем случае, получит аргументы командной строки без изменений и без необходимости заключать их в кавычки.

ПРИМЕЧАНИЕ: я добавил -MO=Deparse только для того, чтобы проиллюстрировать, что компилирует однострочный.

ПРИМЕЧАНИЕ: я добавил -e, чтобы быть в безопасности, поскольку у вас есть -i в командной строке, которая ожидает параметр.

 $ perl -MO=Deparse -e 'system(qw{sed -i -e}, "${vars}s/abc/xyz/", qw{filename.txt})'
 system(('sed', '-i', '-e'), "${vars}s/abc/xyz/", 'filename.txt');
 -e syntax OK

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

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