Shell-Script

在我的腳本中發現錯誤

  • May 30, 2021

我有一個凌亂的腳本,它應該獲取網站的名稱(如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

我究竟做錯了什麼?

你在你的正則表達式中逃避\ 自己。grep即你的\\/意思是字面反斜杠後跟一個正斜杠,並且\\K意味著一個字面反斜杠後面跟一個大寫的K。

此外,/甚至不需要轉義- 僅在用作正則表達式分隔符grep時才需要,預設使用or (通常,最好只使用另一個分隔符 - 例如or , or )。/``sed``perl``,``:``=

只使用普通的 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"

引用自:https://unix.stackexchange.com/questions/652022