Use vários comandos no sed para inserir texto após string com caracteres especiais

0

Estou tendo um pequeno problema ao tentar fazer uma pesquisa e substituir usando sed em um arquivo de configuração.

Eu quero usar vários comandos usando a opção -e para fazer o seguinte.

  • Etapa 1: encontre a primeira ocorrência de DBName=.* no arquivo no início de uma linha e substitua por DBName=localhost
  • Se DBName=.* não existir
    • Etapa 2: encontre a primeira ocorrência de # DBNAME=.* no arquivo no início de uma linha e insira uma linha abaixo da string com DBName=localhost
  • Se # DBNAME=.* não existir
    • Etapa 3: insira DBName=localhost na parte inferior do arquivo

A primeira sintaxe de ocorrências está me atrapalhando. Também o # seguido por um "espaço" na string # DBNAME= também está me pegando.

    
por ausip 09.09.2015 / 09:01

2 respostas

1

Use isto:

sed -e '/^DBName=.*/{s/^DBName=.*/DBName=localhost/;:a;n;ba;q}' \
  -e '/^# DBName=.*/{a \DBName=localhost
  :a;n;ba;q}' -e '$a \DBName=localhost' file

Onde:

  • A instrução primeiro -e pesquisa por ^DBName=.* ( ^ significa desde o começo da linha) e, se for encontrada, a parte no {} brachets será executada: Isso irá procurar e substituir as strings e quando feito, :a define uma etiqueta chamada a , n lê a próxima linha no espaço padrão e a imprime. ba volta para o marcador a . Isso tudo faz com que sed imprima todas as linhas restantes intocadas. Agora sed sai com o comando q neste momento e as outras expressões não serão processadas. Então, a substituição é feita apenas uma vez.
  • A expressão segunda procura por linhas que começam com # DBName=.* e, se encontradas, a adicionam DBName=localhost à próxima linha. Observe que a nova linha aqui no comando é necessária, porque o comando a não deve ter nada depois em sua linha. Quando essa adição estiver concluída, :a;n;ba;q fará o mesmo que na primeira expressão. Se não ...
  • ... a expressão terceiro é processada. Ele adiciona à última linha do arquivo ( $ ) com o comando a a string DBName=localhost .
por 09.09.2015 / 09:39
0
sed -i 's/DBName=.\*/DBName=localhost/g' -e 's/\# DBNAME=.*/DBName=localhost/g' config_file

Ele satisfará suas duas primeiras condições

    
por 09.09.2015 / 09:09