Tenho um script que $variable
armazena um texto com um número indeterminado de linhas. Digamos que eu o nomeei script.bash
e ele está localizado em $HOME
:
#!/bin/bash
# commands on the beginning of my script
variable='Lorem Ipsum is simply dummied
text of the printing and
typesetting industry. Lorem Ipsum has been the
industry standard dummy text ever since the 1500s'
# commands at the end of my script
Eu gostaria de criar um novo script que mudará o texto variable
em script.bash
. A ideia do código seria algo assim:
#!/bin/bash
file="$HOME/script.bash"
mynewvariable='one
two
three'
substitute_everything_inside_variable () {
# code
}
substitute_everything_inside_variable "$mynewvariable" "$file"
Contanto que fosse apenas uma única linha, poderia funcionar substituindo a linha inteira por uma nova usando sed
o seguinte:
sed -i "5s/.*/$mynewvariable/" "$HOME/script.bash"
Mas considerando que eu preciso substituir tudo dentro das aspas simples (e o número de linhas do texto dentro dele é variável), não vejo como eu poderia fazer isso usando ferramentas de linha de comando. Existe uma maneira de fazer isso sem ler e interpretar o que acontece em cada linha?
É muito mais fácil substituir todo o conteúdo de um arquivo do que alterar uma string entre aspas de várias linhas dentro de um arquivo contendo muitas outras coisas que você não deseja quebrar.
Tente colocar o conteúdo de
$variable
em um arquivo (por exemplovfile.txt
, ), e faça com que seu script de shell faça algo comovariable="$(cat vfile.txt)"
.Você pode então usar qualquer método que queira substituir ou modificar
vfile.txt
.Sed tem comandos diferentes de
s
. Você pode procurar a linha inicial, excluir todas as linhas até a última parte do valor e inserir o novo valor. No entanto, é complicado acertar a citação - observe ques/…/$mynewvariable/
falha não apenas com novas linhas, mas também com'
,\
e/
. É mais fácil fazer isso em Perl.Se o arquivo não for muito grande para caber na memória, diga ao Perl para ler o arquivo inteiro, em vez de dividi-lo linha por linha. Não testado.
Explicações:
perl -0777 -i -p
executa o programa Perl no conteúdo do arquivo e, em seguida, substitui o arquivo.-0777
significa processar todo o arquivo de uma só vez, em vez de linha por linha.sed s/…/$mynewvariable/
não funciona).\x27
é uma aspa simples (eu coloco o código Perl entre aspas simples, então não posso usar uma aspa simples dentro).$replacement =~ …
substitui'
no valor pelo'\''
qual representa um'
literal de string de shell entre aspas simples.(?:[^\x27]|\x27\\\x27\x27)
corresponde a um'\''
ou a qualquer caractere que não seja'
.Como você sabe o número da linha da variável onde ela está localizada no arquivo script.bash, você pode fazer isso:
Dessa forma, você evita os caprichos da cotação e a extensão de linha desconhecida da variável $.
HTH