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 grep
expressão regular. ou seja, você \\/
significa uma barra invertida literal seguida por uma barra e \\K
significa 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 sed
ou perl
(e, geralmente, é melhor usar apenas outro delimitador - como ,
ou :
, ou =
).
Use simplesmente un-escaped /
e \K
em 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"