Substitua a string 1 somente quando a string 2, 3 ou 4 presente

2

Basicamente eu sou um oracle dba. Temos uma tarefa para alternar do banco de dados principal para o banco de dados em espera e precisamos entradas de tns (host-name) a serem modificadas de sape-scan para sapi-scan no arquivo tnsnames.ora contendo entradas de conexão do tns SAP_PROD , GOLD_PROD e EVENTS_SAP .

Exemplo:

SAP_PROD =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = sape-scan.walmart.net)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SAP)
    )
  )

sape-scan deve ser alterado para sapi-scan se a entrada do tns for encontrada como SAP_PROD

    
por Mohammeddba 13.07.2017 / 15:38

3 respostas

2

Outra opção, com sed:

sed -re '/^(SAP_PROD|GOLD_PROD|EVENTS_SAP) =/,/^$/s/HOST = sape-scan/HOST = sapi-scan/' tnsnames.ora
  • ativar expressões regulares estendidas ( -r ) para a alternância | regex
  • pegue o próximo parâmetro (o texto citado) como uma expressão para avaliar ( -e )
  • entre as linhas agrupadas por "SAP_PROD", "GOLD_PROD" ou "EVENTS_SAP" no início da linha, seguidas por espaço e sinal de igual, até uma linha em branco,
  • pesquise e substitua o texto "HOST = sape-scan" pelo texto "HOST = sapi-scan"
  • no arquivo tnsnames.ora

Use a versão acima para testar de forma não destrutiva suas alterações, talvez com:

sed ... tnsnames.ora > tnsnames.new
diff tnsnames.ora tnsnames.new

... para ver o que mudou. Em muitas implementações de sed, você pode adicionar um sinalizador -i para fazer as alterações "no local".

    
por 13.07.2017 / 21:59
2

Supondo que uma entrada começa quando há texto na primeira coluna, você pode alterar essas três entradas com

awk '/^[A-Z]/ { substitute = ($1 ~ /^((SAP|GOLD)_PROD|EVENTS_SAP)$/) }
    substitute { sub(/sape-scan/, "sapi-scan") }1' tnsnames.ora >tnsnames.new

O Awk processa cada linha da linha de entrada de acordo com o script, ou seja, o texto entre aspas simples é um programa pequeno que é aplicado a cada linha do arquivo.

Nesse script, a variável substitute é definida como booleana, indicando se a linha de cabeçalho corresponde à expressão regular. Se o booleano é verdadeiro, nós executamos a substituição em cada linha, até vermos outra linha de cabeçalho, e o valor booleano é avaliado novamente e possivelmente atualizado. O único 1 faz com que todas as linhas sejam impressas.

A saída é colocada em um novo arquivo para que você possa diff etc em relação ao original. Se estiver satisfeito com o resultado, você pode substituir o arquivo antigo simplesmente por mv : inserindo o novo arquivo no nome do arquivo antigo.

    
por 13.07.2017 / 17:51
-2

Irmão muito simples, use sed como abaixo

 sed -i -e 's/sape-scan/sapi-scan/g' $(grep -R 'SAP_PROD' ./ *ora|cut -d ':' -f1)

É isso.:)

    
por 13.07.2017 / 16:14