2009-08-04 8 views
25

Ahora bien, según toda la literaturased en OS X - parece que no puede utilizar en expresiones regulares +

echo 1234abcd|sed "s|[0-9]\+|#|g" 

debe #abcd salida. Y

echo abcd|sed "s|[0-9]\+|#|g" 

debería salir abcd.

Pero en OS X 10.4.11 la primera expresión da como resultado 1234abcd. Usar * en lugar de + funciona para el primer ejemplo pero falla en el segundo, dando como resultado #abcd, porque el patrón [0-9] se compara cero veces.

¿El operador + no funciona en expresiones regulares en OS X? ¿Hay una alternativa?

Gracias

+0

sed no significa 'ABCD volver'. Devuelve 0 y arroja "abcd". La salida de un programa es * no * su valor de retorno. –

+0

Usted es muy correcto señor. Yo fixy-fix ahora. – stib

Respuesta

48

En OSX, sed usa por defecto REs básicos. Debería usar sed -E si desea usar RE modernos, incluido el operador uno o más "+".

Ver here para la indicación de que sed utiliza RE básicos por defecto, here para la sintaxis RE moderna, y here para el RE básica (ed) información.


Alternativamente, si usted tiene un motor de expresiones regulares que no apoyo + en absoluto, puede simplemente usar * lugar, mediante la conversión de (por ejemplo):

[a-z]+ 

en:

[a-z][a-z]* 
+2

Esta respuesta es técnicamente correcta, sin embargo, el indicador -E me ha frustrado continuamente porque no es portátil para ninguna de las versiones de sed que comúnmente se incluyen en las distribuciones de Linux. Caveat Emptor. –

+0

@JayTaylor Acabo de venir porque mi expresión regular no funcionó correctamente en Ubuntu Lucid y especificó que '-E' resolvió el problema. – AndreKR

+0

@AndreKR El indicador ''E' funcionará cada vez que use ese dialecto extendido de expresiones regulares. ¡Ojalá pudiera ayudar más y sin detalles adicionales no hay mucho más que pueda decir! –

8

obsoleto expresiones regulares básicas no son compatibles con + y ? cuantificadores. Ellos son personajes regulares.

Alternativas para [0-9]+ son p. [0-9]{1,} o [0-9][0-9]*.

O puede usar sed -E para usar expresiones regulares modernas y extendidas.

1

puede usar awk

# echo 1234abcd| awk '{gsub(/[0-9]+/,"#")}1' 
#abcd 

# echo abcd| awk '{gsub(/[0-9]+/,"#")}1' 
abcd 
+0

Supongo que tendré que aprender awk a continuación. Todavía estoy entendiendo todo. – stib

+2

no va a evitar que aprendas sed, pero una vez que conoces awk dentro y fuera, ya no hay necesidad de usar sed. – ghostdog74

1

Muchas de las utilidades OS X Unix son de versiones que carecen de la comodidad de sus equivalentes GNU. Como dice Pax, puede utilizar -E:

[email protected] drigz 0$ echo 1234abcd | /usr/bin/sed "s/[0-9]\+/#/g" 
1234abcd 
[email protected] drigz 0$ echo 1234abcd | /usr/bin/sed -E "s/[0-9]+/#/g" 
#abcd 

en cuenta que los pequeños cambios en la sintaxis de la expresión regular (\ + a + en este caso).

Sin embargo, yo prefiero usar Fink para obtener utilidades GNU:

[email protected] drigz 0$ echo 1234abcd | /sw/bin/sed "s/[0-9]\+/#/g" 
#abcd 
[email protected] drigz 0$ /sw/bin/sed --version 
GNU sed version 4.1.5 
Copyright (C) 2003 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, 
to the extent permitted by law. 
+0

Supongo que significó \\ + a + (el formato parece haber comido el carácter de escape) Desafortunadamente, el firewall en este lugar parece bloquear a fink y macports, por lo que hay una gran cantidad de diversión GNU que puedo no tiene acceso – stib

+0

hmm .. a veces se come el \ a veces no – stib

+0

Sí - tienes razón. ¿Podrías instalarlos de la manera antigua? (./configure && make && sudo make install) –

2

Si + no funciona, siempre se puede utilizar {1,}

+0

Ah, ya veo, por supuesto. Gracias. – stib

Cuestiones relacionadas