Estoy usando GNU SED para la funcionalidad de buscar y reemplazar en archivos grandes (hasta 2 GB).
Los caracteres de búsqueda y reemplazo pueden contener cualquier carácter, por lo que quiero que los parámetros de búsqueda y reemplazo se traten como texto sin formato tal como aparecen.
No quiero tratar los parámetros de búsqueda o reemplazo como expresiones regulares mediante el comando sed.
He experimentado mucho, pero cada vez obtengo nuevas combinaciones de expresiones regulares que no funcionan para sed como texto sin formato.
¿Cómo se puede lograr esto?
¿Existe alguna fórmula para escapar de los caracteres especiales?
Nota: estoy usando ~
operador como separador de comandos en lugar de/
A continuación se muestra el ejemplo.
sed -ne "s~^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$~Replace" -ne "w output.txt" "input.txt"
El comando anterior no funciona, ya que trata el parámetro de búsqueda como expresión regular (ya que es expresión regular). Por lo tanto, para encontrar el texto tengo que escapar de algunos caracteres especiales en expresiones regulares como se muestra a continuación
sed -ne "s~\^\[-+\]?\[0-9\]\*\\.?\[0-9\]+(\[eE\]\[-+\]?\[0-9\]+)?\$~Replace" -ne "w output.txt" "input.txt"
En otro ejemplo, tengo que modificarlo, .*$
pero .\*\$
no (.*$)
quiero modificar la entrada.
Entonces, ¿existe alguna regla universal para la secuencia de escape?
Respuesta1
P:¿Existe alguna fórmula para escapar de los caracteres especiales?
P:¿Existe alguna regla universal para la secuencia de escape?
A:Puede utilizar el código hexadecimal correspondiente para caracteres especiales, en los casos en los que simplemente escribir /
, .
, *
, ?
, $
etc. se vuelva molesto. Por ejemplo:
sed -rn '/\x22/p' file
imprimirá líneas que contienen comillas dobles, ya que \x22
representa "
.
Si necesita buscar códigos hexadecimales, puede guardarlos cómodamente en un archivo con este comando:
gawk 'BEGIN{for(i=0;i<255;i++){printf("%d\t%x\t%c\n", i,i,i)}}' null >chars.txt