Estou usando o GNU SED para localizar e substituir a funcionalidade em arquivos grandes (até 2 GB).
Os caracteres de localização e substituição podem conter qualquer caractere, portanto, quero que os parâmetros de localização e substituição sejam tratados como texto simples conforme aparecem.
Não quero tratar localizar ou substituir parâmetros como regex pelo comando sed.
Eu experimentei muito, mas sempre recebo novas combinações de regex que não funcionam para sed como texto simples.
Como isso pode ser alcançado?
Existe alguma fórmula para escapar dos caracteres especiais?
Nota: estou usando ~
o operador como separador de comando em vez de/
Abaixo está o exemplo
sed -ne "s~^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$~Replace" -ne "w output.txt" "input.txt"
O comando acima não funciona, pois trata o parâmetro find como regex (como é regex). Portanto, para encontrar o texto, preciso escapar de alguns caracteres especiais em regex, como abaixo
sed -ne "s~\^\[-+\]?\[0-9\]\*\\.?\[0-9\]+(\[eE\]\[-+\]?\[0-9\]+)?\$~Replace" -ne "w output.txt" "input.txt"
Em outro exemplo, tenho que modificar .*$
para .\*\$
Mas (.*$)
não quero modificar a entrada.
Então existe alguma regra universal para sequência de escape?
Responder1
P:Existe alguma fórmula para escapar dos caracteres especiais?
P:Existe alguma regra universal para sequência de escape?
A:Você pode usar o código hexadecimal correspondente para caracteres especiais, nos casos em que apenas digitar /
, .
, *
, ?
, $
, etc. Por exemplo:
sed -rn '/\x22/p' file
imprimirá linhas que contêm aspas duplas, pois \x22
representa "
.
Se precisar procurar códigos hexadecimais, você pode salvá-los convenientemente em um arquivo com este comando:
gawk 'BEGIN{for(i=0;i<255;i++){printf("%d\t%x\t%c\n", i,i,i)}}' null >chars.txt