在我的脚本中发现错误

在我的脚本中发现错误

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

相关内容