私のスクリプトでエラーが見つかりました

私のスクリプトでエラーが見つかりました

ウェブサイト名(例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正規表現区切り文字として使用する場合にのみ必要です(通常、他の区切り文字(or、またはなど)を使用することをお勧めします)。/sedperl,:=

代わりに単純なunescapedを使用してください/\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"

おすすめ記事