2012-08-29 16 views
29

Esto es lo que estoy haciendo (ejemplo simplificado):¿Qué pasa con mi expresión regular anticipada en GNU sed?

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

que estoy tratando de poner bar delante de cada línea que no empiece con foo. Este es el error:

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

¿Qué pasa?

+0

posible duplicado de http://stackoverflow.com/questions/2086450/pcre-regex-to-sed-regex – hostmaster

+1

por favor actualice la respuesta elegida si es posible. [Este] (http://stackoverflow.com/a/12178023/131120) muestra que en realidad es posible lograr lo mismo con sed. – erikbwork

Respuesta

36

Por lo que sé sed no tiene look-ahead ni look-behind. Cambie a un lenguaje más potente con una sintaxis similar, como perl.

+14

Una conversión simple de 'sed' a' perl' para referencia: 'sed 's/before/after/g'/my/file' =>' cat/my/file | perl -ne 's/before/after/g; imprimir; '' – Batandwa

+4

@Batandwa http://www.smallo.ruhr.de/award.html – ceving

+7

@Batandwa El uso de cat y tuberías en perl es redundante. Simplemente use 'perl -pi -e 's/before/after/g'/my/file'. – ypid

6

Utiliza la sintaxis de expresión regular compatible con Perl (PCRE) que no es compatible con GNU sed. Debe volver a escribir su expresión regular de acuerdo con SED Regular-Expressions o usar Perl en su lugar.

83
sed -i '/^foo/! s/^/bar/' file.txt 
  • -i => cambio el archivo en lugar
  • /^foo/! => sólo se realice la siguiente acción en las líneas no (!) comenzando con foo (^foo)
  • s/^/bar/ => cambio al inicio de la línea a la barra  
+3

Muy buena solución. No hay necesidad de un seguimiento posterior. Simplemente use la funcionalidad que sed ya tiene. –

+7

Esto está bien para una expresión anclada como '^ foo', pero desafortunadamente no se extiende al caso general de lookahead negativo en ningún lado en un patrón. – tripleee

Cuestiones relacionadas