Como passar argumentos para perl ao tentar mudar uma linha?

0

Estou usando a abordagem sugerida em link para modificar a primeira linha de um arquivo. Vamos supor que a primeira linha em file.txt seja

keepme=change1me

E eu quero obter

keepme=newstring

A questão é que o newstring é armazenado em var1

Eu tentei:

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

Em ambos os casos, o resultado é

keepme=

Se eu fizer

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
    
por je_b 10.03.2015 / 21:53

2 respostas

1

A partir de sua primeira tentativa, você deseja ${var1} expandido pelo shell e todas as outras variáveis $ protegidas dele (para que o Perl as expanda):

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

As aspas duplas, em vez das aspas simples, fazem com que Perl receba newstring em vez do nome da variável, e escapar dos outros sinais de cifrão com barras invertidas faz com que o shell as passe sem ser tocado.

    
por 10.03.2015 / 22:17
2

Para acessar a variável de ambiente em Perl, você pode usar $ ENV {var1}.

Para fazer isso, você pode exportar a variável, isso significa que a variável está definida até você desmarcá-la:

export var1=newstring

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

Alternativamente, se você quiser apenas definir a variável a ser usada pelo comando Perl quando for executá-la, você poderá atribuí-la à frente do seu comando:

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

    
por 10.03.2015 / 22:18