Ich möchte Folgendes tun
awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}'
Auf diese Weise einem einfachen Anführungszeichen zu entkommen, funktioniert jedoch nicht
awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}'
Wie macht man das? Danke für die Hilfe.
'abc'd'ef'
isabcdef
: Literal plusd
plus Literal. Dasd
ist außerhalb der Anführungszeichen, und Sie können es durch ersetzen,d
um\'
zu machen,'abc'\''ef'
was ausgewertet wirdabc'ef
.Antworten:
Dies ist vielleicht das, wonach Sie suchen:
Das heißt,
'\''
wenn Sie die Öffnung schließen'
, drucken Sie ein Literal,'
indem Sie es verlassen und schließlich wieder öffnen'
.quelle
'
Zeichen schließt das öffnende'
Shell-String-Literal. Das Shell-Literal unterstützt hierfür kein Backslash-Escape. Die Sequenz'\''
der Trick: es schließt das einzelne Anführungszeichen Literal spezifiziert das Zitat - Zeichen (unter Verwendung einer Flucht , die sich außerhalb der einfachen Anführungszeichen Literale unterstützt) und dann wieder öffnet sich ein neues einzelnes Anführungszeichen Literal. Sie können es sich als vierstellige Escape-Sequenz vorstellen, um ein einfaches Anführungszeichen zu erhalten. :)awk
ausschließlich vom Befehlsinterpreter ab, den Sie zum Erstellen von Befehlszeilen verwenden. Das'{printf $2}'
wird zu einem Argument für einenexecve
Systemaufruf oder ähnliches, bei dem es nur wie eine nullterminierte C-Zeichenfolge ohne einfache Anführungszeichen aussieht. Awk sieht die Zitate nie und sed auch nicht. Sie können in der Tat doppelte Anführungszeichen verwenden, aber doppelte Anführungszeichen verhindern nicht die Erweiterung der Shell$2
, sodass Sie dem Dollarzeichen mit einem Backslash entkommen müssen, um es wörtlich zu machen :"{printf \$2}"
.sed -e "s/$FOO/$BAR/"
funktioniert nicht, wenn der wörtliche Text$FOO
durch ersetzt werden soll$BAR
. Der einfachste Weg wäresed -e 's/$FOO/$BAR/
.awk "{ print \"abc\", \$1 }"
. Jedes Mal, wenn ein doppeltes Anführungszeichen im awk-Programm angezeigt wird, muss es maskiert werden, damit das Shell-Anführungszeichen nicht geschlossen wird. Und vergleichen Sie dies:awk '{print "\\"}'
(drucken Sie einen Backslash) mit dem, was es mit doppelten Anführungszeichen braucht :awk "BEGIN {print \"\\\\\" }"
, Puh! Beide Anführungszeichen müssen maskiert werden und beide Backslashes. Die Shell wird in konvertiert\\
,\
sodass wir\\\\
codieren müssen\\
.Ein einfaches Anführungszeichen wird mit dargestellt
\x27
Wie in
Quelle
quelle
\x27
ist eine Erweiterung; POSIX Awk erkennt nur\047
. (\47
Ist auch in\047
), nicht hex (\x27
), Escape-Codes - siehe awk.freeshell.org/PrintASingleQuote .Eine andere Möglichkeit besteht darin, das einfache Anführungszeichen als awk-Variable zu übergeben :
Einfacheres Beispiel mit String-Verkettung:
quelle
quelle
\047
die oktale Escape-Sequenz für das einfache Anführungszeichen ist, finde ich diese Alternative am besten lesbar.Für kleine Skripte besteht eine optionale Möglichkeit, sie lesbar zu machen, darin, eine Variable wie die folgende zu verwenden:
Ich fand es praktisch in einem Fall, in dem ich ein Vielfaches des einfachen Anführungszeichens in der Ausgabe produzieren musste und das \ 047 es völlig unlesbar machte
quelle