Encontrar error en mi script

Encontrar error en mi script

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 grepexpresión regular. es decir, \\/significa una barra invertida literal seguida de una barra diagonal, y \\Ksignifica 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 sedo perl(y, por lo general, es mejor usar otro delimitador, como ,or :o =).

Utilice simplemente un-escaped /y \Ken 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"

información relacionada