Como usar sed para substituir uma linha inteira por outra com caracteres nela

0

O arquivo contém o seguinte na linha 19

send -- "[email protected]\r"

Eu quero mudar o e-mail, então pensei e criei este

sed -i.bak '19s/.*/send -- "[email protected]\r"/' ./a

muda a linha 19 mas o que obtenho é

"end -- "[email protected]

O que está acontecendo de errado e como consertar isso?

    
por Helme 15.04.2018 / 01:22

3 respostas

0

Barra invertida é o caractere de escape em sed padrões, portanto, um retorno de carro literal é inserido. O que você quer é \r - uma barra invertida de escape seguido por um literal r .

    
por 15.04.2018 / 01:47
0

Em vez de pesquisar e substituir, você pode alterar a 19ª linha:

sed '19c\send -- "[email protected]\r"'
    
por 15.04.2018 / 03:52
0

Você está tornando isso mais difícil do que precisa ser - basta alterar o endereço de e-mail, não a linha inteira. Para demonstrar:

$ echo 'send -- "[email protected]\r"'  | sed 's/old@example\.com/[email protected]/'
send -- "[email protected]\r"

BTW, você pode, opcionalmente, usar o modificador g (global) no final do comando s/// se o padrão de pesquisa puder ocorrer mais de uma vez em uma linha e / ou i (ignorar maiúsculas e minúsculas) ) modificador se você quiser uma busca insensível a maiúsculas e minúsculas - por exemplo para usar os dois: s/old@example\.com/[email protected]/ig .

De qualquer forma, seu comando ficaria assim:

sed -i.bak '19s/old@example\.com/[email protected]/' ./a

Se você não souber o número de linha exato a ser alterado, especifique uma expressão regular como o endereço de linha em vez de um número de linha:

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/[email protected]/' ./a

É ainda mais fácil alterar TODAS as ocorrências de [email protected] no arquivo, mas não se incomode em especificar um endereço e a substituição ocorrerá em todas as linhas do arquivo.

sed -i.bak 's/old@example\.com/[email protected]/' ./a
    
por 15.04.2018 / 06:04