Frage

Ich habe gerade alle meine Ausgabedateien mit gawk gemacht worden in die Überprüfung, die ich vermeiden, so viel wie ich kann. Wie funktioniert

gawk 'NF \!= 6' file

unterscheiden sich von

gawk 'NF != 6' file 

das ist, wie funktioniert die Backslash Änderung die Bedeutung dieses Ausdrucks?

Sollte es Ausgangsleitungen mit der Anzahl der Felder anders als 6 und endend mit Backslash?

Ich erhalte die folgende Fehlermeldung auf meine Dateien:

gawk:    ^ backslash not last character on line

Wer?

War es hilfreich?

Lösung

Wenn Sie doppelte Anführungszeichen statt einfache Anführungszeichen verwenden dann ! ist ein Sonderzeichen und sollte mit einem Backslash geschützt werden. Wichtig ist also, Sie das Ausrufezeichen sind auf der Flucht, dass Ihre Shell ist es nicht sehen.

gawk "NF \!= 6" file

Innerhalb doppelte Anführungszeichen die Schale \! zu ! bevor das Argument vorbei gaffen konvertieren. Der Backslash wird durch die Zeit gaffen gegangen aufgerufen.

Mit einzelnen Qutoes, aber die Shell ! Zeichen ignorieren, so gibt es keine Notwendigkeit, sie mit einem Backslash zu entkommen. In der Tat, wie Sie es herausgefunden, ist ein Syntaxfehler so, da die Backslash Ende zu tun bis zu gaffen weitergegeben werden, die barfs auf dem unerwarteten \.

Andere Tipps

Die Zeile ohne den Backslash wie erwartet funktioniert. Allerdings, wenn Sie wollen wissen, wird Backslash in der Regel verwendet, um Sonderzeichen scape (sie verlieren ihre besondere Bedeutung und werden als selbst verwendet wird) und auch lange Linien zu spalten, so dass Sie so etwas wie (unter einem Shell) schreiben können:

$ gawk 'NF \
!= 6' file

, und es würde die gleiche Wirkung hat.

Ihr Beispiel insbesondere ist ein wenig komplizierter. Sie setzen die Zeichenfolge in einfache Anführungszeichen. Dies macht die Schale nicht zu ändern, was Sie schreiben, und sie an das Programm übergeben. Wenn Sie Ihren Backslash Ausdruck zu verwenden, gaffen eine ‚\‘ an einem Ort finden, wo es keine Bedeutung hat (in gawk wird nur verwendet, lange Linien und scape Zeichen in Zeichenketten zu spalten). Im Beispiel, das ich mit einem umgekehrten Schrägstrich in zwei Zeilen geschrieben, gaffen erhält zwei Zeilen durch einen Schrägstrich geteilt (konzeptionell eine Zeile).

Wenn Sie versuchen, Linien entsprechen, die nicht mehr als 6 Felder haben und das tut Ende in einem umgekehrten Schrägstrich, ist dies eine Möglichkeit, das zu tun:

gawk -v 'patt=\\\\$' 'NF != 6 && $0 ~ patt' file

Gawk (und andere AWKs) haben einige komplexe Regeln für Backslash. Deshalb ihre vier Schrägstriche in dem vorhergehenden Befehl sind. (Das Dollarzeichen stellt das Ende der Eingabezeile aus der Datendatei nach einem regulären Ausdruck.)

Ob Sie doppelte oder einfache Anführungszeichen, wenn Sie eine Bourne-ähnliche Shell verwenden, gaffen wird das Programm genau sehen, wie es zwischen den Anführungszeichen angezeigt. Auch in doppelten Anführungszeichen, beide Bourne und csh artigen Schalen nur konsumieren \ bevor Zeichen, die (wie $ entkommen könnten brauchen, und im Fall von csh, - also in csh würde dieses Programm erscheint syntaktisch korrekt zu gaffen, obwohl es immer noch wouldn ‚t tun, was Sie wollen).

! hat keine Bedeutung in diesem Zusammenhang gaffen, so dass es einen Fehler gibt. Um „Ausgangsleitungen mit der Anzahl der Felder anders als 6 und endend mit umgekehrtem Schrägstrich“, zu verwenden:

gawk 'NF != 6 && /\\$/' file

Das heißt: Spiel Linien, die sechs Felder nicht haben, und die Übereinstimmung \ unmittelbar vor Ende der Zeile ($). Die \ muss mit einem anderen Backslash geschützt werden, da glotzt zu Anwendungen \ zu entkommen - wenn auch im Fall von gaffen, alle \ (mit Ausnahme der von einer anderen \ entkam) aufgenommen werden; diejenigen, die keinen besonderen Charakter entkommen sind einfach elided.

Ohne zugehörige Aktion, die Standardaktion (die Zeile gedruckt werden) genommen werden, wenn diese bedingte Anweisung erfüllt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top