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 sed
padrõ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 g
modificador (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 i
modificador (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