2016-04-26 7 views
2

Ich habe einen file1.txt mit den folgenden Inhalten:Verwendung von doppelten Anführungszeichen in doppelten Anführungszeichen

time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F" 

Ich mag die Datei wie unten aussehen:

9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F 

Eigentlich brauche ich das passieren Befehl als String. Aus diesem Grund muss der Befehl bash in eine Zeichenfolge mit doppelten Anführungszeichen eingeschlossen werden. Wenn ich jedoch

" grep -Po '(?<=Fingerprint=)[^"]*' " 

ich bekomme nicht die gewünschte Ausgabe. Es scheint, dass ich die doppelten Anführungszeichen richtig entgehen muss.

+0

Dies ist wohlverdoppelt von http://stackoverflow.com/questions/2005192/how-to-execute-a-bash-command-stored-as-a-string-with-quotes-and-asterisk –

+0

.. .btw, bash und POSIX sh unterscheiden sich in einigen recht relevanten Aspekten (die Bourne-Shell unterscheidet sich noch weiter, ist aber bei allem, was Red Hat jemals ausgeliefert hat, nicht vorhanden, so dass Ihre Tags dies ausschließen). Ich habe einen Bash-Only-Abschnitt in meine Antwort aufgenommen, aber wenn Sie nur nach einem der beiden Tags suchen, wäre es klarer gewesen, ob das akzeptabel war. –

Antwort

5

Um die Literal Frage zu beantworten, können Sie einen umgekehrten Schrägstrich verwenden, um literale doppelte Anführungszeichen in Ihrem Befehl zu umgehen. Jedoch aus den genannten Gründen in BashFAQ #50 ist dies überaus schlechte Praxis:

# Avoid this absent a very good reason 
grep_cmd_str="grep -Po '(?<=Fingerprint=)[^\"]*'" 
eval "$grep_cmd_str" <file1.txt # eval is necessary, with all the issues that implies 

Bessere Praxis, wenn Sie einen einfachen Befehl speichern müssen (ohne Umleitungen oder anderen Shell-Konstrukte) [1] in a Variable ist ein Array [2], nicht eine skalare Variable zu verwenden, seine Argumente zu halten:

# Use this principally if you need to dynamically build up an argument list 
grep_args=(grep -Po '(?<=Fingerprint=)[^"]*') 
"${grep_args[@]}" <file1.txt 

Wenn Sie keine constra haben Ints, die Sie benötigen entweder der oben zu verwenden, sollten Sie eine Funktion (die Umleitungen erlauben tut und Shell baut, solange sie fest einprogrammiert sind):

# Use this whenever possible, in preference to the above 
grep_fp() { grep -Po '(?<=Fingerprint=)[^"]*' "[email protected]"; } 
grep_fp <file1.txt 

[1] - Nicht Bewertung Schale In diesem Zusammenhang ist Konstrukte eine Sicherheitsfunktion: Sie schützt Sie vor bösartigen Dateinamen oder ähnlichen Inhalten in Werten, die in den Wert, den Sie als Befehl verwenden, eingefügt wurden.

[2] - Beachten Sie, dass Arrays in POSIX sh nicht verfügbar sind, für die Ihre Frage auch markiert ist. Das heißt, ähnliche Funktionalität ist durch Überschreiben von "[email protected]" verfügbar (vermutlich in einem begrenzten Bereich, z. B. einer Funktion, so dass der ursprüngliche Wert beibehalten wird).