Soy nuevo en scripts de shell. Quiero enviar una petición http usando curl y, a continuación, extraer el hilo a través de expresiones regulares. Por ejemplo, ¿cómo puedo extraer un nombre de dominio de una respuesta http? (El ejemplo es solo con fines de aprendizaje)

#!/bin/bash
name=$(curl google.com | grep "www\..*com")
echo "domain name is"
echo $name
InformationsquelleAutor ashim | 2013-11-02

2 Comentarios

  1. 91

    Utilizando bash expresiones regulares:

    re="http://([^/]+)/"
    if [[ $name =~ $re ]]; then echo ${BASH_REMATCH[1]}; fi

    Editar – OP pidió explicación de la sintaxis. La sintaxis de expresión Regular es un gran tema que no puedo explicar en su totalidad aquí, pero voy a tratar de explicar lo suficiente como para entender el ejemplo.

    re="http://([^/]+)/"

    Esta es la expresión regular se almacena en un bash variable, re – es decir, lo que usted quiere que su cadena de entrada a partido, y esperemos que extraer una subcadena. Rompiendo:

    • http:// es sólo una cadena – la cadena de entrada debe contener esta subcadena para la expresión regular para que coincida con
    • [] Normalmente se utilizan corchetes decir «coincide con cualquier carácter dentro de los corchetes». Así c[ao]t coincidirá tanto «gato» y «cuna». El ^ carácter dentro de la [] modifica esto para decir «coincide con cualquier carácter excepto aquellos dentro de los corchetes. Así que en este caso [^/] coincidirá con cualquier carácter, aparte de «/».
    • Los corchetes de la expresión sólo coincidirá con uno de los personajes. La adición de un + para el final de la misma dice «match 1 o más de los anteriores sub-expresión». Así [^/]+ coincide con 1 o más del conjunto de todos los caracteres, a excepción de «/».
    • Poner () paréntesis alrededor de una subexpresión dice que desea guardar lo que coincidía con el de la subexpresión para su posterior procesamiento. Si el lenguaje que utiliza es compatible con esto, se va a crear algún mecanismo para recuperar estos submatches. Para bash, es el BASH_REMATCH matriz.
    • Finalmente hacemos una coincidencia exacta «/» para asegurarse de que hemos partido de todo el camino a fin de que el nombre de dominio completo y el siguiente «/»

    Siguiente, tenemos que probar la cadena de entrada con la expresión regular para ver si coincide. Podemos utilizar un bash condicional para hacerlo:

    if [[ $name =~ $re ]]; then
        echo ${BASH_REMATCH[1]}
    fi

    En bash, el [[ ]] especificar una extensa prueba condicional, y puede contener la =~ bash operador de expresión regular. En este caso podemos comprobar si la cadena de entrada $name coincida con la expresión regular $re. Si no coinciden, debido a la construcción de la expresión regular, se nos garantiza que vamos a tener un submatch (de los paréntesis ()), y podemos acceder a ella mediante el BASH_REMATCH matriz:

    • El elemento 0 de esta matriz ${BASH_REMATCH[0]} será toda la cadena igualada por la expresión regular, es decir,»http://www.google.com/«.
    • Posterior de los elementos de esta matriz será posterior de los resultados de submatches. Nota puede tener múltiples submatch () dentro de una expresión regular – El BASH_REMATCH elementos que corresponden a estos en orden. Así que en este caso ${BASH_REMATCH[1]} contendrá «www.google.com», que creo que es la cadena que desea.

    Tenga en cuenta que el contenido de la BASH_REMATCH matriz sólo se aplican a la última vez que la expresión regular =~ operador utilizado. Así que si usted va a hacer más regular la expresión de los partidos, usted debe guardar el contenido que necesitas a partir de esta matriz cada vez.

    Esto puede parecer una larga descripción, pero realmente he glosado varias de las complejidades de las expresiones regulares. Ellos pueden ser muy poderosos, y creo que con un rendimiento decente, pero la sintaxis de las expresiones regulares es complejo. También la expresión regular implementaciones varían, de modo que diferentes idiomas diferentes características y puede haber sutiles diferencias en la sintaxis. En particular, se escape de caracteres dentro de una expresión regular puede ser un tema espinoso, especialmente cuando los personajes tienen un significado diferente en el lenguaje.


    Nota de que, en lugar de la configuración de la $re variable en una línea independiente, y en referencia a esta variable en la condición, usted puede poner la expresión regular directamente en la condición. Sin embargo, en bash 3.2, las reglas fueron cambiadas respecto a si las comillas alrededor de tales literal de las expresiones regulares son necesarios o no. Poner la expresión regular en una variable independiente es una forma sencilla de evitar esto, por lo que el estado funciona como se espera en todas las versiones de bash que apoyan la =~ operador de coincidencia.

    • ¿Qué pasa si usted necesita hacer un mayúsculas y minúsculas coincidan, o cambiar otras banderas?
  2. 7

    Una forma sería con sed. Por ejemplo:

    echo $name | sed -e 's?http://www\.??'

    Normalmente el sed las expresiones regulares son delimitados por `/’, pero se puede usar ‘?’ ya que usted está buscando ‘/’. He aquí otro bash truco. @DigitalTrauma la respuesta me recordó que debo sugerir. Es similar:

    echo ${name#http://www.}

    (DigitalTrauma también obtiene el crédito por recordarme que «http://» debe ser manejado.)

Dejar respuesta

Please enter your comment!
Please enter your name here