Esto es lo que estoy haciendo (ejemplo simplificado):

gsed -i -E 's/^(?!foo)(.*)$/bar/' file.txt

Estoy tratando de poner bar delante de cada línea que no se inicia con foo. Este es el error:

gsed: -e expression #1, char 22: Invalid preceding regular expression

Lo que está mal?

InformationsquelleAutor yegor256 | 2012-08-29

3 Comentarios

  1. 54

    Que yo sepa sed no tiene ni la mirada-por delante ni detrás. Cambiar a una más potente lenguaje con sintaxis similar, como perl.

    • Un simple sed a perl de conversión de referencia: sed 's/before/after/g' /my/file => cat /my/file | perl -ne 's/before/after/g; print;'
    • href=»http://www.smallo.ruhr.de/award.html» >smallo.ruhr.de/award.html
    • El uso del gato y tuberías en perl es redundante. Sólo uso perl -pi -e 's/before/after/g' /my/file.
    • Es muy lamentable que no hay oteo.
  2. 110
    sed -i '/^foo/! s/^/bar/' file.txt
    • -i cambiar el archivo en el lugar
    • /^foo/! sólo realizar la siguiente acción en las líneas no ! comenzando con foo ^foo
    • s/^/bar/ cambiar el inicio de la línea a la barra
       
    • Muy bonito solución. No hay necesidad de seguimiento. Sólo utilice la funcionalidad de sed que ya tiene.
    • Esto está bien para una expresión anclada como ^foo, pero por desgracia no se extiende al caso general de la negativa de oteo en cualquier lugar en un patrón.
    • Lo hace, sin embargo, se extienden cuando sólo una instancia de la sustitución existe en la línea. Por ejemplo, 's/(?!foo)baz/bar/' =>'/foobaz/! s/baz/bar/'. Quizás una correcta aplicación de la inteligencia puede extender este enfoque a las líneas que contienen, por ejemplo, «foobaz baz».
    • Es posible. Verificar esta respuesta para las ideas.
    • Sustitución de la foobaz string con una cadena única que no se producen en cualquier lugar en la entrada (que no es factible con un estudio aleatorizado de cadena si es lo suficientemente largo), luego sustitución del resto bazes, entonces, la sustitución de nuevo la única cadena con foobaz es, de nuevo, una solución que sólo funciona cuando el negativo de oteo es una cadena estática.
    • Si se trata de una longitud fija(que se requiere para lookbehind de todos modos) patrón de cadena todavía se puede incrustar la cadena original en el intermedio de la cadena, de manera que la información no se pierda y pueda ser recuperado posteriormente.

  3. 7

    Utilizar regulares compatibles con perl de expresión (PCRE) sintaxis que no es soportado por GNU sed.
    Se debe volver a escribir su expresión regular de acuerdo a la SED Regular-Expresiones o el uso de perl en su lugar.

Dejar respuesta

Please enter your comment!
Please enter your name here