Ich habe ein chaotisches Skript, das den Namen der Site abrufen soll (etwa 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 "$@"
Und aus irgendeinem Grund $(...)
wird nichts zurückgegeben, während die Ausführung außerhalb des Skripts einwandfrei funktioniert.
$ ./test.sh https://nothing.bandcamp.com/music
https://nothing.bandcamp.com/music
Erwartetes Verhalten:
$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g"
Nothing.Bandcamp
Was mache ich falsch?
Antwort1
Sie maskieren \
sich selbst in Ihrem grep
regulären Ausdruck. Das heißt, Ihr \\/
bedeutet einen wörtlichen Backslash, gefolgt von einem Schrägstrich, und \\K
bedeutet einen wörtlichen Backslash, gefolgt von einem großen K.
Außerdem /
muss nicht einmal mit maskiert werden grep
– dies ist nur bei Verwendung /
als Regex-Trennzeichen erforderlich, wie es die Standardeinstellung mit sed
oder ist perl
(und normalerweise ist es besser, einfach ein anderes Trennzeichen zu verwenden – etwa ,
oder :
, oder =
).
Verwenden Sie stattdessen einfach das unmaskierte /
und \K
. Beispiel:
#!/bin/bash
ARTIST=$(echo "$@" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g')
echo "$ARTIST"
Beispielausgabe:
$ ./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
Hinweis: Dies gilt sowohl bei der Ausführung in der Befehlszeile als auch bei der Ausführung in einem Skript.
Beispielsweise ergibt das Folgendekeine Leistung, genauso wie es in einem Skript der Fall wäre:
$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g"