Нахожу ошибку в своем скрипте

Нахожу ошибку в своем скрипте

У меня есть запутанный скрипт, который должен получить имя сайта (вроде 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 "$@"

И по какой-то причине $(...)ничего не возвращает, а при запуске вне скрипта работает нормально.

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

Ожидаемое поведение:

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

Что я делаю не так?

решение1

Вы экранируете \само себя в своем grepрегулярном выражении. То есть \\/означает буквальный обратный слеш, за которым следует прямой слеш, а \\Kозначает буквальный обратный слеш, за которым следует заглавная буква K.

Кроме того, /его даже не нужно экранировать с помощью grep— это необходимо только при использовании /в качестве разделителя регулярных выражений, как и по умолчанию с помощью sedor perl(и, как правило, лучше просто использовать другой разделитель — например, ,or :, or =).

Используйте просто un-escaped /, и \Kвместо этого. Например:

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

Пример вывода:

$ ./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

Примечание: это справедливо как при запуске в командной строке, так и при запуске в скрипте.

например, следующее производитнет выхода, так же, как и в сценарии:

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

Связанный контент