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
.
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?
Em vez de pesquisar e substituir, você pode alterar a 19ª linha:
sed '19c\send -- "[email protected]\r"'
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
Tags sed linux text-editing text-editors