У меня есть запутанный скрипт, который должен получить имя сайта (вроде 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
— это необходимо только при использовании /
в качестве разделителя регулярных выражений, как и по умолчанию с помощью sed
or 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"