Как передать аргументы perl при попытке изменить строку?

Я использую подход, предложенный в https://askubuntu.com/questions/434051/how-to-replace-a-string-on-the-5th-line-of-multiple-text-files, чтобы изменить первую строку архив. Предположим, что первая строка в file.txt

 keepme=change1me 

И я хочу получить

 keepme=newstring 

Проблема в том, что newstring хранится в var1

Я пытался:

 var1=newstring perl -i -pe 's/(keepme=)(.*)/$1${var1}/ if $.==1' ../file.txt perl ${var1} -i -pe 's/(keepme=)(.*)/$1$ARGV[0]/ if $.==1' ../file.txt 

В обоих случаях результат

 keepme= 

Если я сделаю

 perl -i -pe ${var1} 's/(keepme=)(.*)/$1$ARGV[0]/ if $.==1' ../file.txt Can't open s/(genome1=)(.*)/$1$ARGV[0]wq/ if $.==1: No such file or directory 

  • Поиск и замена Perl записывает каждый файл
  • Разберите XML-файл, чтобы скопировать содержимое в другой файл в определенном месте в файле?
  • Скрипт загружает два аргумента
  • Ошибка при попытке вызова find из perl
  • Perl-скрипт, делать cd на терминале
  • Удалить до заданного символа, начиная с заданной строки
  • Изменить имена файлов в Makefile
  • Как передать путь к файлу через вызов perl из bash?
  • 2 Solutions collect form web for “Как передать аргументы perl при попытке изменить строку?”

    Начиная с вашей первой попытки, вы хотите, чтобы ${var1} расширялась оболочкой, и все остальные $ переменные защищались от нее (так что Perl расширяет их):

     perl -i -pe "s/(keepme=)(.*)/\$1${var1}/ if \$. == 1" ../file.txt 

    Двойные кавычки, а не одинарные кавычки, делают так, что Perl получает newstring вместо имени переменной, а экранирование других знаков доллара с помощью обратных косых черт делает оболочку передачей их через нетронутую.

    Чтобы получить доступ к переменной окружения в Perl, вы можете использовать $ ENV {var1}.

    Для этого вы можете экспортировать переменную, это будет означать, что переменная установлена ​​до тех пор, пока вы ее не отключите:

    export var1 = newstring

    perl -i -pe 's / (keepme =) (. *) / $ 1 $ ENV {var1} / if $. == 1' ../file.txt

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

    var1 = newstring2 perl -i -pe 's / (keepme =) (. *) / $ 1 $ ENV {var1} / if $. == 1' ../file.txt

    Linux и Unix - лучшая ОС в мире.