Shell-Script
在我的腳本中發現錯誤
我有一個凌亂的腳本,它應該獲取網站的名稱(如
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"