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

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

O arquivo contém o seguinte na linha 19

send -- "[email protected]\r"

Quero mudar o e-mail então pensei e pensei nisso

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

isso muda a linha 19, mas o que recebo é

"end -- "[email protected]

O que está acontecendo de errado e como consertar?

Responder1

A barra invertida é o caractere de escape nos sedpadrões, então umaliteralretorno de carro é inserido. O que você quer é \\r- uma barra invertida com escape seguida por um literal r.

Responder2

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

sed '19c\send -- "[email protected]\\r"'

Responder3

Você está tornando isso mais difícil do que deveria 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 gmodificador (global) no final do comando comando s///se o padrão de pesquisa puder ocorrer mais de uma vez em uma linha e/ou o imodificador (ignore case) se desejar uma pesquisa sem distinção entre maiúsculas e minúsculas - por exemplo, para use ambos: .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 sabia o número exato da linha a ser alterado, especifique uma expressão regular como o endereço da 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[e-mail protegido]no arquivo, apenas não se preocupe em especificar um endereço e a substituição acontecerá em todas as linhas do arquivo.

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

informação relacionada