Fundo
Eu gostaria de pegar a seguinte string /etc/default/hostapd
e adicionar um certo valor após o =
:
#DAEMON_CONF=""
->DAEMON_CONF="/etc/hostapd/hostapd.conf"
Teste
un_comment_and_add_value() {
file="$1"
given_str="$2" ##DAEMON_CONF=""
value="$3" # /etc/hostapd/hostapd.conf
#dont know where to put this in the 'sed' cmd
sed -i "/$given_str/s/^#//g" "$file"
}
un_comment_and_add_value "/etc/default/hostapd" "#DAEMON_CONF=\"\"" "/etc/default/hostapd"
Para o exemplo dado, tente
/^$given_str/
se a string fornecida corresponder ao início da linhas/.//
remova o primeiro caracteres|.$|$value\"|
substitua o último caractere pela string de substituição fornecida e aspas duplasLeitura Adicional:
Você pode usar algo assim:
sed -i /etc/default/hostapd -e '/^#DAEMON_CONF=/s;^#\([^=]*\)=.*;\1='"${VALUE}"';'
-i
editar arquivo no lugar/etc/default/hostapd
arquivo para editar/^#DAEMON_CONF=/
linhas de filtro começando com#DAEMON_CONF=
s;
substituto^#\([^=]*\)=.*;
substitua a linha inteira, mas lembre-se do nome da variável, a string entre#
e até=
, ou seja. DAEMON_CONF neste caso\1=${VALUE}
substitua a linha pelo${remembered variable name}=${VALUE}
Eu fiz isso abaixo do comando sed, deixe-me saber para qualquer dúvida
Arquivo de entrada obtido como abaixo
cat /etc/default/hostapd
comando:
resultado
Duas coisas aqui. Primeiro, para expandir as variáveis do shell, você precisa colocá-las entre aspas duplas, não entre aspas simples. Dois, você precisa agrupar as substituições para que ambas dependam da correspondência de padrão. (Ou duplique a correspondência de padrão antes de cada
s///
.) Três, já que a substituição contém barras, é melhor usar algum outro caractere como separador paras
, como o sinal de porcentagem aqui.Observe que você precisa ter certeza de que a variável
value
não contém sinais de porcentagem; e se você precisar inserir um literal$
ou uma barra invertida no comando sed, precisará escapá-los, pois o shell os processa dentro de barras invertidas.Então você também pode querer considerar isso: Como garantir que a string interpolada na substituição `sed` escape de todos os metacaracteres