br comando de comando substituir texto por 'caractere

1

Eu tenho um arquivo sql muito grande que não consigo abrir em um editor de gui. Eu preciso substituir a string 'user1' @ 'localhost' (observe o 'caractere') por 'user2' @ 'localhost', mas estou tendo problemas para encontrar a sintaxe correta para o comando sed.

Eu posso pegar as strings para substituir corretamente usando o seguinte comando grep:

grep -w 'user1'@'localhost'

Qualquer ajuda por favor? Obrigado.

    
por brpaz 02.07.2013 / 11:49

2 respostas

4

Pensei em uma solução mais geral do que a sua pergunta.

Vamos imaginar que você precise encontrar uma string com base nos seus critérios de pesquisa de expressões regulares. Você gostaria de substituir apenas uma parte dela e deixar as outras partes correspondentes inalteradas.

Para demonstrar com um exemplo:

echo "'some-name'@'some-host'" | sed -r "s/(')([^']+)('@'[^']*')/user2/g"

exibirá:

'user2'@'some-host'

O comando sed executa a substituição usando a sintaxe s/search-regexp/replacement/g . No nosso caso:

  • (') corresponde à primeira cotação única. Isso é trivial, mas poderia ser mais complexo. Representa a parte da string antes da substituição. sed atribui o valor desta sub-expressão à variável especial .
  • ([^']+) corresponde ao nome do usuário. Basicamente qualquer personagem a partir da posição anterior que não é uma citação. sed atribui o valor desta sub-expressão à variável especial .
  • ('@'[^']*') corresponde à parte '@'host-name' . Da mesma forma que a subexpressão anterior, uma cotação, uma @ , uma cotação novamente e qualquer caractere que não seja uma cotação e, em seguida, uma cotação no final. sed atribui o valor desta sub-expressão à variável especial .

A peça de substituição substituirá qualquer coisa que corresponda à regexp de pesquisa. Usando as variáveis mostradas acima, podemos substituir o nome do usuário e deixar as outras regiões intactas. + seu novo nome de usuário + produzirá o resultado desejado. Assim:

user2

Resultados em:

  • Qualquer conteúdo que a primeira sub-expressão tenha (é uma aspa simples)
  • seguido pela string "user2", (nota intencionalmente não é usada, porque substituímos o nome de usuário)
  • e finalmente o conteúdo da terceira sub-expressão (que é um '@ e o nome do host entre aspas).

Se você cat do seu arquivo de script e canalizá-lo para o comando sed , você deve obter o resultado desejado.

    
por lgarzo 02.07.2013 / 13:10
0

Envolver seu comando sed em torno de marcas de voz funcionará:

adder@adamj-T1500:~$ cat sed_test 
user1'@'localhost
adder@adamj-T1500:~$ sed -i -e "s/user1'@'localhost/user2'@'localhost/" sed_test
adder@adamj-T1500:~$ cat sed_test 
user2'@'localhost

Há várias maneiras diferentes de você escapar de uma cota única para um comando sed , há várias perguntas com respostas em stackoverflow:

link

link

link

    
por AJefferiss 02.07.2013 / 12:09