Como usar variáveis ​​de ambiente no comando sed

Como usar variáveis ​​de ambiente no comando sed
Uma variável de ambiente é um valor de nome dinamicamente. Variáveis ​​ambientais geralmente são exportadas para um terminal usando o comando mostrado abaixo.
exportar $ algumVariable = valor

Os arquivos estão disponíveis em todos os terminais após a fonte; Para esse fim, as variáveis ​​ambientais são armazenadas dentro de arquivos Bash.

Suponha que o usuário precise usar ou alterar variáveis ​​ambientais com a ajuda do comando sed. Nesse caso, os usuários não podem usar o comando como mencionado acima. Diferentes funções e métodos devem ser usados ​​para o comando sed. Neste artigo, veremos alguns métodos desses, que são os seguintes.

Na linha de comando Linux, o Sed é uma ferramenta de processamento potente. Usando as frases de um sed compactas, os usuários geralmente fazem substituição de texto, o que é bastante conveniente. Quando os usuários substituem sed por variáveis ​​de concha, ele também tem algumas desvantagens.

Como usar variáveis ​​de ambiente no comando sed

Vamos ter um exemplo, aqui temos um arquivo chamado teste.TXT.

teste de gato.TXT
Current_time = # preencha o
Data e hora atuais
Java_home = # preencha o
Java_home Path

Escreveremos um script de shell para preencher o caminho java_home e o horário atual no sistema atual acima, dado. Este processo é fácil, mas há alguns problemas que são possíveis. Aqui vamos escrever um script usando GNU sed.

Como mencionamos acima, aqui, substituiremos o caminho Java_Home e o horário atual. Para isso, primeiro preencheremos o horário atual nos lugares certos aqui. Podemos usar o comando de data para obter a hora atual.

solução de gato.sh
#!/bin/sh
My_date = $ (data)
sed -i -r 's/^(current_time =).*/\ 1 $ my_date/'teste.TXT

O script escrito acima não é muito difícil de entender. Ao substituir o comando primeiro em uma variável my_date, obtenha o tempo e a data atual e salve -o.

Depois de obter os dados usando a substituição sed, o usuário os preenche no arquivo. Usamos a opção -i do comando gnu sed para executar a edição no local.

Agora vamos verificar e executar nosso script.

$ ./solução.sh
$ Teste CAT.TXT
Current_time = $ my_date
Java_home = # preencha o caminho java_home

Vemos na saída que a linha com "current_time =" foi substituída. No entanto, o literal "$ my_date" é preenchido em vez do tempo e data atual.

A razão pela qual as variáveis ​​de shell não são expandidas em citações únicas é que usamos citações únicas sob o comando sed.

As aspas duplas são usadas no comando sed para permitir a expansão da variável de shell de correção rápida.

$ CAT Solução.sh
#!/bin/sh
My_date = $ (data)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"teste.TXT

Agora vamos testar a solução.SH Script novamente.

$ ./solução.sh
$ Teste CAT.TXT
Current_time = quarta -feira, 27 de janeiro, 22:02:05 CET 2021
Java_home = # preencha o caminho java_home

Depois de preencher a hora e a data nos lugares certos, o caminho java_home é preenchido.

Vemos qual delimitador devemos usar adicionando outro comando sed à nossa solução.script sh.

$ CAT Solução.sh
..
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"teste.TXT
sed -i -r "s/^(java_home =).*/\ 1 $ java_home/"teste.TXT

Verificando o script acima.

$ ./solução.sh
sed: -e expressão nº 1, char 24: opção desconhecida para 's'

Vemos que o novo comando sed que foi adicionado não está funcionando. Se testá -lo pela segunda vez, vemos que apenas sua variável é diferente, mas funcionar é o mesmo que o comando sed. Para resolver isso, devemos tomar as seguintes medidas:

O delimitador não existe na variável

Para saber isso bem, os usuários devem primeiro entender o que a variável de ambiente $ java_home contém.

$ echo $ java_home
/usr/lib/jvm/padrão

Podemos ver essas variáveis ​​de shell são expandidas dentro de duas quartas. Portanto, nosso segundo comando sed vem após expansão variável.

sed -i -r "s/^(java_home =).*/\ 1/usr/lib/jvm/default/"teste.TXT

As barras (/) no valor da variável interferem no comando 'S' (S/Padrão/Substituição/), e é por isso que o comando sed acima não funciona. Dessa forma, podemos selecionar outros personagens como delimitadores do comando 's'.

Os usuários podem modificar ligeiramente o segundo comando sed para resolver isso usando '#' como o delimitador do comando s.

sed -i -r "s#^(java_home =).*#\ 1 $ java_home#"teste.TXT

Agora testamos o script acima.

$ ./solução.sh
$ Teste CAT.TXT
Current_time = quarta -feira, 27 de janeiro, 22:36:57 CET 2021
Java_home =/usr/lib/jvm/padrão

Solução 2

solução.SH funciona na maioria dos casos. Além disso, vemos que '#' em nomes de arquivo é um caractere válido na maioria dos sistemas de arquivos *nix. Se executarmos nosso script em java_home em um sistema definido como /opt /#jvm#, o script do usuário falha novamente. Faremos o seguinte trabalho para que nosso script funcione em todos os casos

  1. Se o usuário tomar '#' como delimitador para obter melhor legibilidade, ele deve selecionar um delimitador para o comando sed.
  2. Temos que escapar de todos os caracteres delimitadores que estão no conteúdo da variável.
  3. Por fim, colete o material restante no comando sed.

Os usuários podem usar a substituição do Bash para escapar do delimitador. Por exemplo, o usuário pode escapar de todos os caracteres '#' na variável $ var.

$ Var = "foo#bar#blah"
$ echo "$ var //#/\\#"
foo \ #bar \ #blah

Agora vamos aplicar nosso script aqui.

$ CAT Solução.sh
#!/bin/sh
My_date = $ (data)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"teste.TXT
sed -i -r "s#^(java_home =).*#\ 1 $ java_home //#/\\##"teste.TXT

Testaremos executando nosso script com a variável espúria Java_home para ver se funciona como esperado.

$ Java_home =/opt/#/:/@/-/_/$/jvm ./solução.sh
$ Teste CAT.TXT
Current_time = qui 28 de janeiro 11:23:07 CET 2021
Java_home =/opt/#/:/@/-/_/$/jvm

Concluímos que nosso script funciona, embora tenhamos muitos personagens especiais em nossa variável java_home.

Conclusão

Neste artigo, vimos como usar variáveis ​​ambientais com o comando sed. Eles também cometem muitos erros que causam, que também mencionamos neste artigo e sua reparação. Esperamos que, neste artigo, você obtenha o conhecimento completo de que precisa.