Mi ejemplo de cadena es como sigue:

This is 02G05 a test string 20-Jul-2012

Ahora de la cadena anterior quiero extraer 02G05. Por que he intentado de la siguiente expresión regular con sed

$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'

Pero el comando anterior se imprime nada y la razón por la que yo creo es que no es capaz de igualar nada en contra de la modelo que se suministra a la sed.

Así, mi pregunta es ¿qué estoy haciendo mal y cómo corregirlo.

Cuando yo trate de la cadena y el patrón con python puedo obtener mi resultado

>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
  • Python es definitivamente no sed. Su regex sabores son muy diferentes.
InformationsquelleAutor RanRag | 2012-07-19

5 Comentarios

  1. 73

    El patrón \d podría no ser compatible con su sed. Trate de [0-9] o [[:digit:]] lugar.

    Para imprimir sólo la real del partido (no la totalidad de la coincidencia de la línea), el uso de una sustitución.

    sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*//p'
    • Gracias funcionó bien. Pero tengo una pregunta ¿por qué .* es necesario con su expresión regular porque cuando intento sed -n 's/\([0-9]\+G[0-9]\+\)/\1/p' sólo imprime la totalidad de la línea.
    • Por eso, ¿no? Reemplazar todo lo que viene antes y después del partido con norhing, a continuación, imprimir la totalidad de la línea.
    • Ah…ahora lo entiendo
    • Esto sólo se imprime 2G05 no 02G05. La expresión que funciona es 's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
    • Que duro códigos a exactamente dos dígitos. Algo así como sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p' sería más general. (Supongo que su sed apoya \? para cero o una aparición.)
    • Véase también stackoverflow.com/a/48898886/874188 para reemplazar varios otros Perl comunes escapa como \w, \s, etc.

  2. 83

    Cómo sobre el uso de egrep?

    echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'
    • +1 Esto es más simple, y también manejar correctamente el caso de partidos múltiples en la misma línea. Un complejo sed secuencia de comandos se puede diseñar para ese caso, pero ¿por qué molestarse?
    • egrep utiliza extendida regexp, sed y grep utiliza el estándar de la regexp, egrep o grep -e o sed -E uso extendido regexp, y el código de python en la cuestión de los usos de PCRE, (perl común de la expresión regular) de GNU grep puede utilizar PCRE con -P opción.
    • realidad que debe ser egrep o grep -E o sed -r
    • Para una sola(la primera) coinciden, append ` | head -1` (sin comillas simples inclinadas), como por esta respuesta a otra pregunta.
    • Algunos sed implementaciones utilizan -r, otros utilizan -E; otros aún no tiene una opción para cambiar el regex dialecto.
    • grep ha -m 1 a parar después de que el primer partido.

  3. 5

    Intente esto en su lugar:

    echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*//'

    Pero tenga en cuenta, si hay dos patrón en una línea, se le imprime el 2do.

    • O, más generalmente, el último si hay varias coincidencias.
  4. 4

    sed no reconoce \d, uso [[:digit:]] lugar. Usted también tendrá que escapar de la + o utilizar el -r interruptor (-E en OS X).

    Nota que [0-9] funciona igual de bien para el árabe-Hindú números.

  5. 0

    Trate de usar rextract. Te dará la posibilidad de extraer el texto utilizando una expresión regular y formatear.

    Ejemplo:

    $ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' ''
    
    2G05

Dejar respuesta

Please enter your comment!
Please enter your name here