Estoy estoy tratando de reemplazar una serie de asterix símbolos en un archivo de texto con un -999.9 el uso de sed. Sin embargo, yo no puedo entender cómo correctamente escapar el símbolo de comodín.

por ejemplo,

$ echo "2006.0,1.0,************,-5.0" | sed 's/************/-999.9/g'
sed: 1: "s/************/-999.9/g": RE error: repetition-operator operand invalid

No funciona. Y

$ echo "2006.0,1.0,************,-5.0" | sed 's/[************]/-999.9/g'
2006.0,1.0,-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9-999.9,-5.0

pone un -999.9 para todos * que no es lo que la intención de ambos.

Gracias!

InformationsquelleAutor user1516252 | 2015-09-24

5 Comentarios

  1. 5

    Usar este:

    echo "2006.0,1.0,************,-5.0" | sed 's/[*]\+/-999.9/g'

    Prueba:

    $ echo "2006.0,1.0,************,-5.0" | sed 's/[*]\+/-999.9/g'
    2006.0,1.0,-999.9,-5.0
  2. 5

    Cualquiera de estos (y más) es una expresión regular que va a modificar esa línea, como usted desee:

    $ echo "2006.0,1.0,************,-5.0" | sed 's/\*\**/999.9/g'
    2006.0,1.0,999.9,-5.0
    
    $ echo "2006.0,1.0,************,-5.0" | sed 's/\*\+/999.9/g'
    2006.0,1.0,999.9,-5.0
    
    $ echo "2006.0,1.0,************,-5.0" | sed -r 's/\*+/999.9/g'
    2006.0,1.0,999.9,-5.0
    
    $ echo "2006.0,1.0,************,-5.0" | sed 's/\*\{12\}/999.9/g'
    2006.0,1.0,999.9,-5.0
    
    $ echo "2006.0,1.0,************,-5.0" | sed -r 's/\*{12}/999.9/g'
    2006.0,1.0,999.9,-5.0
    
    $ echo "2006.0,1.0,************,-5.0" | sed 's/\*\{1,\}/999.9/g'
    2006.0,1.0,999.9,-5.0
    
    $ echo "2006.0,1.0,************,-5.0" | sed -r 's/\*{1,}/999.9/g'
    2006.0,1.0,999.9,-5.0

    sed opera sobre las expresiones regulares, no cadenas, por lo que necesitan aprender la sintaxis de expresión regular si vas a usar sed y, en particular, la diferencia entre las Bras (sed que usa por defecto) y EREs (que algunos sed puede ser dijo a utilizar en su lugar) y PCREs (sed que nunca se utiliza, pero algunas otras herramientas y «regexp checkers» hacer). Sólo la primera solución anterior es una BRE que funcionará en todos los seds en todas las plataformas. Google es tu amigo.

  3. 2

    * es una expresión regular símbolo que necesita ser escapado.

    Usted puede incluso utilizar BASH cadena de reemplazo:

    s="2006.0,1.0,************,-5.0"
    echo "${s/\**,/-999.9,}"
    2006.0,1.0,-999.9,-5.0

    Utilizando sed:

    sed 's/\*\+/999.9/g' <<< "$s"
    2006.0,1.0,999.9,-5.0
    • Estoy sorprendido de que el primer comando no introducir una tonelada de -999.9s desde \** significa cero o más ocurrencias de *. La salida de echo "2006.0,1.0,************,-5.0" | sed 's/\**/999.9/g' es 999.92999.90999.90999.96999.9.999.90999.9,999.91999.9.999.90999.9,999.9,999.9-999.95999.9.999.90999.9 yo hubiera esperado que usted necesita \*\** para una o más, como \*+, en la cáscara como en la sed y otras herramientas, pero claramente no y nose por qué!
    • En realidad \** no es ni siquiera una expresión regular es un pegote de coincidencia de patrón literal * seguido por cualquier cosa y por eso he , en la final a parar esto.
    • Ah, englobamiento, por supuesto. Sólo uno más de los indicios de que el shell no es para la manipulación de texto, ya que incluso las cosas que utilizan, que PARECE que es para la manipulación de texto en realidad es algo completamente diferente que tiene sentido para la generación de nombre de archivo en lugar de eso! Tal vez el cambio de la primera frase de * is a regex symbol a * is a wildcard symbol meaning repetition that's used in the shell for globbing and in UNIX tools like sed, grep, awk for regexps y, a continuación, estado que es el que en su 2 scripts?
  4. 2

    Ya, * son especiales meta personaje que se repite el anterior token de cero o más veces. Escape * en orden para que coincida literal * caracteres.

    sed 's/\*\*\*\*\*\*\*\*\*\*\*\*/-999.9/g'
  5. 0

    Cuando esta posibilidad se introdujo en gawk no tengo idea!

    gawk -F, '{sub(/************/,"-999.9",$3)}1' OFS=, file
    2006.0,1.0,-999.9,-5.0 

Dejar respuesta

Please enter your comment!
Please enter your name here