Frage

Ich mag mit dem cut Befehl Raum als Trennzeichen verwenden.

Welche Syntax kann ich für diesen Einsatz?

War es hilfreich?

Lösung

cut -d ' ' -f 2

Wo 2 ist die Feldnummer des Leerzeichen getrennte Feld, das Sie wollen.

Andere Tipps

In der Regel, wenn Sie Raum als Trennzeichen verwenden, möchten Sie mehrere Räume wie ein behandeln, weil Sie die Ausgabe eines Befehls analysieren einige Spalten mit Leerzeichen ausrichten. (Und die Google-Suche nach, dass mich hier führen)

In diesem Fall wird ein einzelner cut Befehl nicht ausreichend ist, und Sie müssen verwenden:

tr -s ' ' | cut -d ' ' -f 2

oder

awk '{print $2}'

, die bestehenden, hilfreiche Antworten zu ergänzen; Spitze des Hutes Unterstützen QZ mich für die Förderung eine separate Antwort zu schreiben:

Zwei verschiedene Mechanismen ins Spiel kommt hier:

  • (a) ob cut selbst erfordert das Trennzeichen (Leerzeichen, in diesem Fall) an die -d Option übergab ein separates Argument oder ob sein, es ist akzeptabel, anhängen es direkt -d.

  • (b), wie die Shell allgemeine Argumente parst, bevor sie an dem Befehl aufgerufen wird.

  • Passieren

(a) durch ein Zitat aus dem POSIX-Richtlinien für Utilities (Hervorhebung von mir)

  

Wenn die SYNTAX eines Standard-Dienstprogramm zeigt eine Option mit einem obligatorisch Option-Argument [...] eine konforme Anwendung wird mit getrennt Argumente für das Option und seine Option-Argument . Doch , eine konforme Implementierung muss auch Genehmigungs die Option und Option-Argument in dem gleichen Argumente String angeben, ohne Zeichen dazwischen .

Mit anderen Worten: In diesem Fall weil -d die Option-Argument ist obligatorisch , Sie können wählen , ob die angeben Trennzeichen wie :

  • (n) entweder: a getrennt Argument
  • (d) OR:. Als Wert direkt an -d

Sobald Sie gewählt (n) oder (d), ist es die Shell 's String-wörtliche Parsing - (b) -, dass Angelegenheiten:

  • Mit Ansatz (n) , die alle der folgenden Formen sind äquivalent:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • Mit Ansatz (d) , die alle der folgenden Formen sind äquivalent:

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

Die Gleichwertigkeit wird erklärt durch die Shell 's String-wörtliche Verarbeitung:

Alle Lösungen obige Ergebnis in der genau die gleiche Zeichenfolge (in jeder Gruppe) durch die Zeit cut sieht sie :

  • (n) : cut sieht -d, als eigene Argument, gefolgt von einem getrennt Argument, das ein Leerzeichen enthält char -. ohne Anführungszeichen oder \ Präfix

  • (d) : cut sieht -d und ein Raum char - ohne Anführungszeichen oder \ Präfix! -. Als Teil des gleicher Argument

Der Grund, die Formulare in den jeweiligen Gruppen letztlich identisch sind, ist zweifach, basierend auf , wie die Shell Parsen Stringliterale :

  • Die Shell ermöglicht wörtliche angegeben werden wie durch einen Mechanismus namens unter Angabe , die nehmen verschiedene Formen :
    • einfache Anführungszeichen Strings: der Inhalt innerhalb '...' genommen wörtlich und bildet eine Single Argument
    • doppelte Anführungszeichen Strings: der Inhalt innerhalb "..." auch ein Einzelformulare Argument, sondern unterliegt Interpolation (Variablenreferenzen erweitert wie $var, Befehlsersetzungen ($(...) oder `...`) oder arithmetische Erweiterungen ($(( ... ))).
    • \-Zitat von einzelne Zeichen : a \ ein einzelnes Zeichen vorangehenden bewirkt, dass Zeichen als Literal interpretiert werden.
  • Zitiert wird ergänzt durch Zitat Entfernung , was bedeutet, dass, sobald die Schale eine Befehlszeile analysiert hat, ist es entfernt die Anführungszeichen aus den Argumenten (umschließenden '...' oder "..." oder \ Instanzen) - also der Befehl sein aufgerufen nie die Anführungszeichen sieht.

Sie können auch sagen,

cut -d\  -f 2

beachten Sie, dass es zwei Leerzeichen nach dem umgekehrten Schrägstrich.

gerade entdeckt , dass Sie auch Verwendung "-d ":

cut "-d "

Test

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

scut , ein Ausschnitt wie Dienstprogramm (intelligentes, aber langsamer I hergestellt), die jede perl regex als Bruch Token verwenden kann. Brechen auf Leerzeichen ist der Standard, aber Sie können auch brechen auf Multi-char reguläre Ausdrücke, alternativen Regexes, etc.

scut -f='6 2 8 7' < input.file  > output.file

so der obige Befehl würde Spalten auf Leerzeichen brechen und Dekomprimierung der (0-basiert) cols 6 2 8 7 in dieser Reihenfolge.

Sie können es nicht mit Schnitt leicht tun, wenn die Daten beispielsweise mehrere Räume hat. Ich habe es nützlich gefunden Eingang für eine leichtere Verarbeitung zu normalisieren. Ein Trick ist, sed, wie unten für die Normierung zu verwenden.

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

Ich habe eine Antwort (Ich gebe etwas verwirrend Antwort), dass involvessed, reguläre Ausdrücke und Capture-Gruppen:

  • \S* - erstes Wort
  • \s* - Begrenzer
  • (\S*) - zweites Wort - gefangen
  • .* - Rest der Zeile

Als sed Ausdruck, die Capture-Gruppe werden muss entkommen, das heißt \( und \).

Die \1 gibt eine Kopie der erfassten Gruppe, das heißt dem zweiten Wort.

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

Wenn Sie an dieser Antwort suchen, der etwas verwirrend, und, denken Sie vielleicht, warum die Mühe? Nun, ich bin der Hoffnung, dass einige, kann gehen „Aha!“ und wird dieses Muster verwendet einige komplexen Textextraktion Probleme mit einem einzigen sed Ausdruck zu lösen.

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