Usando "sed", como adiciono um valor após o sinal "=" em uma string?

0

Plano de fundo

Eu gostaria de usar a seguinte string de /etc/default/hostapd e adicionar um determinado valor depois do = :

#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"
    
por Nicholas Adamou 12.01.2018 / 15:08

4 respostas

0

Por exemplo, tente

sed -i "/^$given_str/{s/.//; s|.$|$value\"|}" "$file"
  • Observe o uso de aspas duplas, permite a interpolação de variáveis
  • /^$given_str/ se tiver correspondência de string no início da linha
    • s/.// remove o primeiro caractere
    • s|.$|$value\"| substitui o último caractere por uma string de substituição e uma aspa dupla

Leitura adicional:

por 12.01.2018 / 15:37
0
$ cat input
#DAEMON_CONF=""
$ key=DAEMON_CONF
$ value="/etc/hostapd/hostapd.conf"

$ sed "/^$key/ { s/^#//; s%=.*%=\"$value\"%; }" input
DAEMON_CONF="/etc/hostapd/hostapd.conf"

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ões. (Ou duplique a correspondência de padrões antes de cada s/// .) Três, como a substituição contém barras, é melhor usarmos outro caractere como separador para s , 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, então; e se você precisar inserir um literal $ ou uma barra invertida no comando sed, você precisará escapar deles, já que o shell os processa dentro de barras invertidas.

Você também pode querer considerar isso também: Como garantir que a string interpolada na substituição 'sed' escape de todos os metacarismos

    
por 12.01.2018 / 15:38
0

Eu fiz isso abaixo do comando sed me avise para qualquer dúvida

Extraiu o arquivo de entrada como abaixo

cat / etc / default / hostapd

#DAEMON_CONF=""

comando:

sed -i '/#DAEMON_CONF/s/^#//g' /etc/default/hostapd ; sed -i 's/"/&\/etc\/hostapd\/hostapd.conf/1' /etc/default/hostapd 

saída

DAEMON_CONF="/etc/hostapd/hostapd.conf"
    
por 12.01.2018 / 15:28
0

Você pode usar algo assim:

sed -i /etc/default/hostapd -e '/^#DAEMON_CONF=/s;^#\([^=]*\)=.*;='"${VALUE}"';'

  • -i editar arquivo no lugar
  • /etc/default/hostapd arquivo para editar
  • /^#DAEMON_CONF=/ filtram linhas que começam com #DAEMON_CONF=
  • s; substituto
  • ^#\([^=]*\)=.*; substitui toda a linha, mas lembre-se do nome da variável, a string entre # e até = , ou seja. DAEMON_CONF neste caso
  • =${VALUE} substitui a linha pelo ${remembered variable name}=${VALUE}
por 12.01.2018 / 15:21