2010-07-23 9 views
24

estoy con cáscara y tengo esta cadena: 12 BBQ ,45 rofl, 89 lolCómo extraer un valor de una cadena utilizando expresiones regulares y un shell?

El uso de la expresión regular: \d+ (?=rofl), quiero 45 como resultado.

¿Es correcto utilizar expresiones regulares para extraer datos de una cadena? Lo mejor que he hecho es resaltar el valor en algunos de los editores de expresiones regulares en línea. La mayoría de las veces elimina el valor de mi cadena.

estoy investigando expr, pero todo lo que consigo es errores de sintaxis.

¿Cómo puedo manejar para extraer 45 en un script de shell?

+1

¿Qué herramienta se utiliza, lo que shell utiliza usted, ¿cuál es la línea de comandos exacta que utilizó y lo que es el error que tienes? – Abel

+0

en mi humilde opinión para este propósito, utilizando Regex es completamente aceptable. –

Respuesta

41

Usted puede hacer esto con el modo de GNU grep Perl:

echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o 

-P significa Perl-estilo, y -o significa único partido.

+0

¿Es posible evitar el uso del estilo perl, ya que se elimina de grep en OS X desde Mountain Lion? – AlexKorovyansky

+0

Posible alternativa/solución alternativa para OS X es el uso de gnu grep a través de homebrew, http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html. – AlexKorovyansky

+0

Puedo recuperar el número de puerto de los contenedores Docker: D con 'docker port c62c1c7b9efb | grep -P '(\ d +) $' -o' –

8

Parece que estás haciendo muchas cosas. Para responder a ellas:

  • Sí, está bien para extraer datos de una cadena usando expresiones regulares, que es lo que están allí para
  • obtiene errores, cuál y qué herramienta de cáscara se utilizan?
  • Puede extraer los números por la captura de ellos en el paréntesis de captura:

    .*(\d+) rofl.* 
    

    y el uso de $1 para obtener la cadena a cabo (.* es para "el resto antes y después en la misma línea)

con sed como ejemplo, la idea se convierte en este para reemplazar todas las cadenas en un archivo con sólo el número correspondiente:

sed -e 's/.*(\d+) rofl.*/$1/g' inputFileName > outputFileName 

o:

echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g' 
+0

No necesita ninguno de los '. *' en su ejemplo. Solo necesita aquellos en los bordes si su expresión regular está anclada. Sin anclaje, ya coincidirá en cualquier lugar dentro de la cadena. – Daenyth

+0

El OP pidió sacar solo el número, no hacer una coincidencia exitosa. Al agregar '. *', Es una manera simple de hacer coincidir todo y reemplazar por lo que está en el paréntesis correspondiente. Sin ellos, el resto de la cadena permanece intacta, lo cual no es lo que se preguntó (iiuc). ¿O me perdí algo quizás? – Abel

+0

Woops, echaba de menos que estabas usando 'sed' para esto. Continua. – Daenyth

-1

que sin duda puede extraer esa parte de una cadena y eso es una gran manera de analizar los datos a cabo. La sintaxis de expresión regular varía mucho, por lo que debe hacer referencia al archivo de ayuda para la expresión regular que está utilizando. Usted puede tratar de una expresión regular como:

[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+ 

Si su programa de expresiones regulares puede hacer sustitución de cadenas vuelva a colocar toda la cadena con el resultado que desea y se puede utilizar fácilmente ese resultado.

Usted no ha mencionado si está usando bash o alguna otra concha. Eso ayudaría a obtener mejores respuestas cuando pida ayuda.

6

Sí expresiones regulares sin duda puede ser utilizado para extraer parte de una cadena. Lamentablemente, los diferentes sabores de * nix y diferentes herramientas utilizan variantes de Regex ligeramente diferentes.

Este comando sed debería funcionar en la mayoría de los sabores (Probado en OS/X y RedHat)

echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g' 
0

puede utilizar la cáscara (bash por ejemplo)

$ string="12 BBQ ,45 rofl, 89 lol" 
$ echo ${string% rofl*} 
12 BBQ ,45 
$ string=${string% rofl*} 
$ echo ${string##*,} 
45 
-1

Puede utilizar rextract a extraer usando una expresión regular y reformatear el resultado.

Ejemplo:

[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}' 
45 
+4

Debe agregar una exención de responsabilidad si la biblioteca es suya (algo así como "Descargo de responsabilidad: hice esta biblioteca"). Y desde github, parece que esta biblioteca/ejecutable es tuya – Justin

Cuestiones relacionadas