sed? - Inserir linha após uma string com caracteres especiais para o serviço Neutron

0

Eu estou tentando escrever um script bash que irá inserir uma string após a correspondência em uma string

/usr/lib/systemd/system/neutron-server.service

Eu consegui fazer isso em outros arquivos facilmente, já que eu inseri variáveis em arquivos de configuração necessários, mas este parece estar causando problemas.

Eu acredito que o erro é que o sed não está ignorando os caracteres especiais. Na minha tentativa eu tentei usar sed de aspas simples e aspas duplas (que eu entendo são para variáveis, mas pensei que poderia mudar alguma coisa. Existe uma maneira melhor de fazer isto ou algum sinal especial de sed ou sintaxe que eu estou faltando? / p>

sed ‘/--config-file /etc/neutron/plugin.ini/a\--config-file /etc/neutron/plugins/ml2/ml2_conf_cisco_apic.ini‘ /usr/lib/systemd/system/neutron-server

TL; DR - Inserir

--config-file /etc/neutron/plugins/ml2/ml2_conf_cisco_apic.ini 

Depois

--config-file /etc/neutron/plugin.ini

Arquivo tradicional

[Unit]
Description=OpenStack Neutron Server
After=syslog.target network.target

[Service]
Type=notify
User=neutron
ExecStart=/usr/bin/neutron-server --config-file /usr/share/neutron/neutron-
dist.conf --config-dir /usr/share/neutron/server --config-file 
/etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini --config-dir 
/etc/neutron/conf.d/common --config-dir /etc/neutron/conf.d/neutron-server -
-log-file /var/log/neutron/server.log
PrivateTmp=true
NotifyAccess=all
KillMode=process
TimeoutStartSec="infinity"

[Install]
WantedBy=multi-user.target

Arquivo após o comando de mudança desejado.

[Unit]
Description=OpenStack Neutron Server
After=syslog.target network.target

[Service]
Type=notify
User=neutron
ExecStart=/usr/bin/neutron-server --config-file /usr/share/neutron/neutron-
dist.conf --config-dir /usr/share/neutron/server --config-file 
/etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini --config-
file /etc/neutron/plugins/ml2/ml2_conf_cisco_apic.ini --config-dir 
/etc/neutron/conf.d/common --config-dir /etc/neutron/conf.d/neutron-server -
-log-file /var/log/neutron/server.log
PrivateTmp=true
NotifyAccess=all
KillMode=process
TimeoutStartSec="infinity"

[Install]
WantedBy=multi-user.target
    
por Alec Chamberlain 13.06.2017 / 22:48

2 respostas

0

sed -i.bak 's_--config-file /etc/neutron/plugin.ini_& --config-file /etc/neutron/plugins/ml2/ml2_conf_cisco_apic.ini_' /usr/lib/systemd/system/neutron-server.service  

O arquivo original será preservado como neutron-server.service.bak . Basta procurar a string para inserir algo depois e substituí-la por essa string seguida pela inserção. Usar _ em vez de / para o delimitador sed torna os segmentos de antes e depois de substituição muito menores em piquetes.

    
por 13.06.2017 / 23:41
0

Seu problema não é de nenhum caractere incompreendido por sed , mas é o comando incorreto a que você escolheu implantar neste cenário. O comando append, a , coloca o texto após a linha selecionada, enquanto o que você precisa é a inserção de algum texto dentro da linha selecionada. Para isso, você precisa do comando s/// .

Se é uma coisa de uma só vez, então você pode simplesmente codificar a substituição como já mostrado pelo DopeGhoti. Mas se você quiser um tipo de operação de preenchimento-e-esqueça-esqueça, então você precisa seguir estes passos:

  1. Defina sua pesquisa & substitua strings.
  2. Prepare uma versão com escape dessas cadeias para que, não importa o que elas contenham, você não precise mexer com o comando sed novamente.
  3. Execute o comando usando as strings de escape em vez de originais.
 # define strings
srch='--config-file /etc/neutron/plugin.ini'
repl='--config-file /etc/neutron/plugins/ml2/ml2_conf_cisco_apic.ini'

# generate their escaped versions
srch_esc=$(printf '%s\n' "$srch"  | sed -e 's|[][^\/.*$]|\&|g')
repl_esc=$(printf '%s\n' "$repl"  | sed -e 's|[\&/]|\&|g;$!s/$/\/')

# run
sed -e '
   /^\[Service]/,/^$/!b
   /^ExecStart=/!b
   '"s/[[:space:]]${srch_esc}[[:space:]]/&${repl_esc} /"'
' yourfile

Explicação

  1. Selecione o intervalo apropriado onde você quer que a substituição aconteça, no seu caso está dentro das linhas que vão da linha [Service] ... vazia. Ao fazer isso, reduzimos as chances de fazer uma alteração em uma área indesejada.
  2. Uma vez dentro do alcance, nos concentramos na linha de interesse, no seu caso, está na linha começando com ExecStart =.
  3. Aqui nós apenas usamos as variáveis de escape em vez dos originais e também saímos das aspas simples, entramos em aspas duplas ... coloque os dados ... saia de aspas duplas, volte para aspas simples. (para manter o universo das citações feliz)
por 14.06.2017 / 00:11