Fehler in meinem Skript gefunden

Fehler in meinem Skript gefunden

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 grepregulären Ausdruck. Das heißt, Ihr \\/bedeutet einen wörtlichen Backslash, gefolgt von einem Schrägstrich, und \\Kbedeutet 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 sedoder 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"

verwandte Informationen