¿Cómo hacer coincidir los dígitos seguidos de un punto usando sed?
76
Estoy tratando de usar sedpara sustituir todos los patrones con dígitos seguidos inmediatamente por un punto (como 3., 355.) por una cadena vacía. Entonces intento:
Eso si quieres cero o más dígitos. /[[:digit:]]*\. /coincidirá con la cadena foo.porque permite cero dígitos. Si quieres usar uno o más \+como se muestra
glenn jackman el
71
Dos problemas:
sedno soporta \d. Use [0-9]o [[:digit:]].
+deben ser barras invertidas para obtener el significado especial: \+.
en lugar de reducir el + (que no funciona en Mac OS X, por ejemplo), puede usar la opción -E para interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).Tristemente, esto no ayuda con el problema \ d ...
gMale
44
@gmale: -Eno funciona para GNU sed, en su -rlugar usa .
choroba
12
Está bien ... seguro que parece seduna mierda cuando se trata de portabilidad ...
iconoclast
@ Choroba Creo que me confundí hoy. Voy a eliminar mis ruidosos comentarios ...
Steven Lu
Básicamente, lo que estaba tratando de advertir a la gente es: si no usa expresiones regulares extendidas ( -Een BSD sed y -ren GNU sed), en BSD sed, ni +ni \+(lo mismo con ?) funcionará, mientras que en GNU sed puede hacer que trabajen con la barra invertida. De ahí la recomendación común de utilizar expresiones regulares extendidas en las secuencias de comandos
Steven Lu
3
La página de manual de sed hace referencia a la página de manual de re_format. Hace 2 distinciones: (1) expresiones regulares obsoletas versus extendidas; (2) expresiones regulares no mejoradas versus mejoradas. Las 4 combinaciones son posibles. Hay soporte en sed para obsoletos y extendidos, pero en cualquier caso solo para no mejorados. El operador \ d es una característica de las expresiones regulares mejoradas, por lo tanto, no es compatible con sed.
Respuestas:
Debido a que sed no es perl, las expresiones regulares sed no tienen una
\d
abreviatura:sed documentación de expresión regular aquí .
fuente
/[[:digit:]]*\. /
coincidirá con la cadenafoo.
porque permite cero dígitos. Si quieres usar uno o más\+
como se muestraDos problemas:
sed
no soporta\d
. Use[0-9]
o[[:digit:]]
.+
deben ser barras invertidas para obtener el significado especial:\+
.fuente
interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).
Tristemente, esto no ayuda con el problema \ d ...-E
no funciona para GNU sed, en su-r
lugar usa .sed
una mierda cuando se trata de portabilidad ...-E
en BSD sed y-r
en GNU sed), en BSD sed, ni+
ni\+
(lo mismo con?
) funcionará, mientras que en GNU sed puede hacer que trabajen con la barra invertida. De ahí la recomendación común de utilizar expresiones regulares extendidas en las secuencias de comandosLa página de manual de sed hace referencia a la página de manual de re_format. Hace 2 distinciones: (1) expresiones regulares obsoletas versus extendidas; (2) expresiones regulares no mejoradas versus mejoradas. Las 4 combinaciones son posibles. Hay soporte en sed para obsoletos y extendidos, pero en cualquier caso solo para no mejorados. El operador \ d es una característica de las expresiones regulares mejoradas, por lo tanto, no es compatible con sed.
fuente