我有一个凌乱的脚本,应该获取网站的名称(例如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"