You can use awk
with the option -F
, which indicates which character will be used to separate the value field in each line. In this case, I will use =
, to separate the field name from its value.
Then just compare the field name and make the substitution according to what you need. The script would look like this:
#!/bin/bash
valor=$1
arquivo=$2
awk -F'=' '{if ($1 == "campo3") { print $1 "=" ENVIRON["valor"] } else { print $1 "=" $2}}' $arquivo
That is, if the field name is campo3
, write the new value, or write the values you already have.
The script takes two parameters: the value to be placed on campo3
and the name of the file to be read. I assigned the script parameters to variables with clearer names, so that they are not confused with the fields $1
and $2
of awk
(in the case, within the awk
, $1
is the name of the field and $2
is its value).
For example, if the script name is trocaval.sh
, just rotate:
trocaval.sh novo_valor arquivo.config
The exit will be:
campo1=valor
campo2=valor
campo3=novo_valor
If you want to play output to a new file, use >
to redirect the output:
trocaval.sh novo_valor arquivo.config > novo_arquivo.config
I do not recommend redirecting the output to the same file as it can be overwritten and you will lose its content. It is more guaranteed to write first into a new file, and if so, rename it:
mv novo_arquivo.config arquivo.config
If you want, you can put all this inside the script too:
#!/bin/bash
valor=$1
arquivo=$2
# joga a saída do awk em um novo arquivo
awk .... > novo_arquivo
# renomeia o novo_arquivo para o nome do arquivo original
mv novo_arquivo $arquivo
echo "campo3=$valorDaSuaVariavel" >> seuArquivo.txt
– Gabriel Hardoim
This will cause the field3 to be inserted at the end of the file, I want to replace the value of what already exists.
– fdavid