awk print Apostroph / einfaches Anführungszeichen

Kann nicht herausfinden, wie man mit awk alles maskiert.

Ich muss jede Eingabe einschließen Zeichenfolge mit einfachen Anführungszeichen, z. B.

input string1 string2 string3 output "string1" "string2" "string3" 

Ich habe mit der Flucht von " " $0 und allem anderen gekämpft und kann es einfach nicht machen es funktioniert. Entweder wird $ 0 direkt an bash übergeben, oder es passiert etwas anderes.

Kommentare

Antwort

Hier einige Möglichkeiten:

  1. verwendet oktale Escape-Sequenzen. Auf ASCII-basierten Systemen, auf denen " als Byte 39 (oktal 047) codiert ist, wäre dies:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. Übergeben Sie das Anführungszeichen als Variable

     $ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3" 

Kommentare

  • "\047" ist mir nie in den Sinn gekommen. Wow. Danke.
  • O. r Speichern Sie Ihr awk-Skript in einer Datei script.awk, um es als awk -f script.awk input auszuführen, und führen Sie dann einfach { print "'" $0 "'" } oder { printf "'%s'\n", $0 }. Die Unfähigkeit, ' s in einem ' -begrenzten Skript zu verwenden, ist ein Shell-Problem, kein awk-Problem.
  • Jedes entkommene Oktal von man ascii ist gut in awk. Sogar \000 für NUL (in GNU / awk, aber nicht mawk) und \042 für "
  • Ich empfehle das Hinzufügen von # 3: Escape-Anführungszeichen auf Shell-Ebene: awk '{ print "'\''" $0 "'\''" }' input und # 4 verwenden doppelte Anführungszeichen auf Shell-Ebene: awk "{print \"'\" \$0 \"'\" }" input. Da dies die akzeptierte Antwort ist und bereits mehrere Methoden auflistet, kann sie auch diese Alternativen enthalten.

Antwort

Setzen Sie im awk-Code den Apostroph einfach in doppelte Anführungszeichen. Sie können Zeichenfolgen verketten, indem Sie sie nebeneinander platzieren (Nebeneinander), unabhängig davon, wie diese Zeichenfolgen aufgebaut sind (Literal, Variable, Feldreferenz, Ausdruck in Klammern, …).

 { print """ $0 """ }  

Wenn dieser awk-Code in einem Shell-Skript enthalten ist und der awk-Code in einem Literal in einfachen Anführungszeichen steht, müssen Sie die Übergabe arrangieren das einfache Anführungszeichen zu awk. Verwenden Sie ein einfaches Anführungszeichen-Backslash-einfaches Anführungszeichen-einfaches Anführungszeichen "\"" , um ein einfaches Anführungszeichen in a aufzunehmen Shell-Literal in einfachen Anführungszeichen.

 awk "{ print ""\""" $0 ""\""" }"  

Alternativ können Sie den awk-Code ohne Verwendung ausdrücken ein einfaches Anführungszeichen. Sie können einen Backslash gefolgt von drei Oktalziffern verwenden, um ein beliebiges Zeichen in einem String-Literal in awk darzustellen. Für ein einfaches Anführungszeichen auf ASCII-basierten Systemen lautet dies „s \047.

 awk "{ print "\047" $0 "\047" }"  

Kommentare

  • awk '{ print "'\''" $0 "'\''" }' das ist einfach verrückt.
  • @ ArtemS.Tashkinov Es ' ist auch bei weitem die überlegene Lösung, wenn es um Portabilität geht, und ich würde argumentieren, dass es für jemanden verständlicher ist, der Shell so gut kennt, wie er sollte, wenn ' verwenden Shell als Oktal-Escapezeichen. '\'' ist etwas, das jeder, der Shell-Scripting ausführt, verinnerlichen sollte, um einfache Anführungszeichen in a zu umgehen Shell-Zeichenfolge in einfachen Anführungszeichen, insbesondere weil Zeichenfolgen in einfachen Anführungszeichen die robuste / tragbare / sicherste Methode sind, um beliebigen Zeichenfolgen in allen Bourne-ähnlichen Shells zu entkommen. Alternativ können Sie den awk-Code auch in Zeichenfolgen in doppelten Anführungszeichen setzen: awk "{print \"'\" \$0 \"'\" }"

Antwort

Beachten Sie Folgendes t Sie brauchen dafür nicht awk.

Sie können stattdessen das Basisdienstprogramm paste verwenden:

 < input paste -d """ /dev/null - /dev/null 

Es wäre effizienter und hätte weniger Einschränkungen als awk -basiert oder sed -basierte Lösungen.

Antwort

Der awk-Code muss nur

{ print """ $0 """ } 

Sie können das in eine Datei einfügen, sodass Sie nichts zitieren müssen:

$ printf "a\nb\n" | awk -f quote.awk "a" "b" 

Oder verwenden eine Zeichenfolge in doppelten Anführungszeichen und maskieren Sie die Anführungszeichen und das Dollarzeichen:

$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }" 

Oder verwenden Sie in Bash / ksh / zsh die $"..." Form von Anführungszeichen, mit denen Sie dem einfachen Anführungszeichen im Inneren entkommen können:

$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }" 

Antwort

Sie können auch den Befehl sed verwenden.

<infile sed -E "s/^|$/"/g" 

oder

<infile sed -E "s/.*/"&"/" 

Kommentare

  • Oder sed -E "s/.*/'&'/" infile.
  • @chepner Ja, das habe ich in Antwort verschoben 🙂

Antwort

Eins Die Zeichenfolge kann in einfache Anführungszeichen gesetzt werden, indem der Befehl printf gnu xargs verwendet wird:

< file xargs -d"\n" printf ""%s"\n" 

Perl

perl -sple "$_="$q$_$q"" -- -q=\" file 

Verwenden von GNU sed:

sed -e "G;H;z;x;y/\n/"/" file 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.