Tengo un script desordenado que debería obtener el nombre del sitio (como https://google.com/etc
):
#!/bin/bash
ARTIST=$(echo "$@" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g")
echo $(echo "$@" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g")
echo "$ARTIST"
echo "$@"
Y por alguna razón, $(...)
no devuelve nada mientras se ejecuta fuera del script y funciona bien.
$ ./test.sh https://nothing.bandcamp.com/music
https://nothing.bandcamp.com/music
Comportamiento esperado:
$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g"
Nothing.Bandcamp
¿Qué estoy haciendo mal?
Respuesta1
Te estás escapando \
de sí mismo en tu grep
expresión regular. es decir, \\/
significa una barra invertida literal seguida de una barra diagonal, y \\K
significa una barra invertida literal seguida de una K mayúscula.
Además, /
ni siquiera es necesario escapar con grep
; eso solo es necesario cuando se usa /
como delimitador de expresiones regulares, como es el valor predeterminado con sed
o perl
(y, por lo general, es mejor usar otro delimitador, como ,
or :
o =
).
Utilice simplemente un-escaped /
y \K
en su lugar. Por ejemplo:
#!/bin/bash
ARTIST=$(echo "$@" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g')
echo "$ARTIST"
Salida de muestra:
$ ./test.sh https://nothing.bandcamp.com/music
Nothing.Bandcamp
$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g'
Nothing.Bandcamp
Nota: esto es tan cierto cuando se ejecuta en la línea de comando como cuando se ejecuta en un script.
por ejemplo, lo siguiente produceninguna salida, igual que lo haría en un script:
$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g"