¿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:

sed 's/\d+\.//g' file.txt

Pero no funciona. ¿Porqué es eso?

Mika H.
fuente
1
Este artículo me pareció muy útil
Stphane,

Respuestas:

111

Debido a que sed no es perl, las expresiones regulares sed no tienen una \dabreviatura:

sed 's/[[:digit:]]\+\.//g'

sed documentación de expresión regular aquí .

Glenn Jackman
fuente
3
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:

  1. sedno soporta \d. Use [0-9]o [[:digit:]].

  2. +deben ser barras invertidas para obtener el significado especial: \+.

choroba
fuente
66
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.

Jonathan Pool
fuente