
ウェブサイト名(例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、またはなど)を使用することをお勧めします)。/
sed
perl
,
:
=
代わりに単純な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"