在我的腳本中發現錯誤

在我的腳本中發現錯誤

我有一個凌亂的腳本,應該要取得網站的名稱(例如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- 僅當用作正則表達式分隔符時才需要/,默認情況下使用sedor 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"

相關內容