Encontrando erro no meu script

Encontrando erro no meu script

Eu tenho um script confuso que deve receber o nome do site (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 "$@"

E por algum motivo, $(...)não retorna nada enquanto a execução fora do script funciona bem.

$ ./test.sh https://nothing.bandcamp.com/music   
https://nothing.bandcamp.com/music 

Comportamento esperado:

$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g" 
Nothing.Bandcamp

O que estou fazendo de errado?

Responder1

Você está escapando \em sua grepexpressão regular. ou seja, você \\/significa uma barra invertida literal seguida por uma barra e \\Ksignifica uma barra invertida literal seguida por um K maiúsculo.

Além disso, /nem precisa ser escapado com grep- isso só é necessário ao usar /como delimitador regex, como é o padrão com sedou perl(e, geralmente, é melhor usar apenas outro delimitador - como ,ou :, ou =).

Use simplesmente un-escaped /e \Kem vez disso. Por exemplo:

#!/bin/bash
ARTIST=$(echo "$@" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g')
echo "$ARTIST"

Exemplo de saída:

$ ./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: isso é tão verdadeiro quando executado na linha de comando quanto quando executado em um script.

por exemplo, o seguinte produzsem saída, da mesma forma que faria em um script:

$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g"

informação relacionada