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:
- Defina sua pesquisa & substitua strings.
- 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.
- 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
- 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.
- Uma vez dentro do alcance, nos concentramos na linha de interesse, no seu caso, está na linha começando com ExecStart =.
- 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)