我有一個凌亂的腳本,應該要取得網站的名稱(例如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
。即,your\\/
表示原義反斜線後接正斜杠,and\\K
表示原義反斜杠後跟大寫 K。
另外,/
甚至不需要使用轉義grep
- 僅當用作正則表達式分隔符時才需要/
,默認情況下使用sed
or perl
(並且通常最好使用另一個分隔符 - 例如,
or :
、 or =
)。
使用簡單的未轉義的/
,\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"