425 Stimmen

Leerzeichen als Begrenzungszeichen mit dem Befehl cut verwenden

Ich möchte ein Leerzeichen als Begrenzungszeichen mit der cut Befehl.

Welche Syntax kann ich dafür verwenden?

469voto

RichieHindle Punkte 256891
cut -d ' ' -f 2

Dabei ist 2 die Feldnummer des gewünschten durch Leerzeichen getrennten Feldes.

258voto

BeniBela Punkte 15534

Wenn Sie Leerzeichen als Trennzeichen verwenden, möchten Sie normalerweise mehrere Leerzeichen als eines behandeln, da Sie die Ausgabe eines Befehls parsen, der einige Spalten mit Leerzeichen ausrichtet. (und die Google-Suche nach diesem Thema führte mich hierher)

In diesem Fall ist eine einzige cut ist nicht ausreichend, und Sie müssen den Befehl verwenden:

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

Oder

awk '{print $2}'

61voto

mklement0 Punkte 303096

Zur Ergänzung der vorhandenen, hilfreichen Antworten; Hut ab vor QZ-Unterstützung dass Sie mich ermutigt haben, eine gesonderte Antwort zu veröffentlichen:

Zwei unterschiedliche Mechanismen kommen hier ins Spiel:

  • (a) ob cut selbst benötigt das Begrenzungszeichen (in diesem Fall ein Leerzeichen), das an die -d Option zu sein separate Auseinandersetzung oder ob es akzeptabel ist, es anzuhängen direkt a -d .

  • (b) wie die Shell analysiert im Allgemeinen die Argumente, bevor sie an den aufgerufenen Befehl übergeben werden.

(a) wird mit einem Zitat aus der POSIX-Richtlinien für Dienstprogramme (Hervorhebung von mir)

Wenn die SYNOPSIS eines Standarddienstprogramms eine Option mit einem obligatorisch option-argument [...] eine konforme Anwendung verwenden getrennt Argumente für diese Option und ihr Optionsargument . Allerdings muss eine konforme Implementierung auch den Anwendungen erlauben, die Option und das Optionsargument in derselben Argumentationskette ohne Zwischenzeichen anzugeben .

Mit anderen Worten: In diesem Fall, denn -d ist das Options-Argument obligatorisch , können Sie wählen. ob das Begrenzungszeichen als :

  • (s) EITHER: a getrennt Argument
  • (d) OR: als Wert direkt angeschlossen a -d .

Wenn Sie sich für (s) oder (d) entschieden haben, ist es die Shell ist das Parsen von Zeichenketten - (b) - das zählt:

  • Mit Ansatz (s) sind alle der folgenden Formen gleichwertig:

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

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

Die Gleichwertigkeit erklärt sich durch die Shell Verarbeitung von String-Literalen:

Alle Die obigen Lösungen führen zu den genau dieselbe Zeichenfolge (in jeder Gruppe) bis zu dem Zeitpunkt cut sieht sie :

  • (s) : cut siehe -d als seine eigene Argument, gefolgt von einem getrennt Argument, das ein Leerzeichen enthält - ohne Anführungszeichen oder \ vorwählen.

  • (d) : cut siehe -d plus ein Leerzeichen - ohne Anführungszeichen oder \ Vorwahl! - als Teil der dieselbe Argument.

Der Grund dafür, dass die Formulare in den jeweiligen Gruppen letztlich identisch sind, liegt in zwei Punkten begründet wie die Shell parst String-Literale :

  • Die Shell erlaubt die Angabe von Literalen wie gehabt über einen Mechanismus namens zitiert nach die dauern kann mehrere Formen :
    • einfach zitiert Strings: der Inhalt im Inneren '...' wird genommen buchstäblich und bildet eine einzeln Argument
    • in Anführungszeichen Strings: der Inhalt im Inneren "..." bildet auch eine einzeln Argument, sondern unterliegt der Interpolation (erweitert Variablenreferenzen wie $var , Befehlssubstitutionen ( $(...) o `...` ), oder arithmetische Erweiterungen ( $(( ... )) ).
    • \ -Zitat von individuell Zeichen : a \ vor einem einzelnen Zeichen bewirkt, dass dieses Zeichen als Literal interpretiert wird.
  • Das Angebot wird ergänzt durch Angebotserstellung Das bedeutet, dass die Shell, sobald sie eine Befehlszeile analysiert hat, diese beseitigt die Anführungszeichen aus den Argumenten (unter Beifügung von '...' o "..." o \ Instanzen) - also, der aufgerufene Befehl sieht nie die Anführungszeichen .

49voto

Chas. Owens Punkte 62716

Sie können auch sagen:

cut -d\  -f 2

Beachten Sie, dass nach dem Backslash zwei Leerzeichen stehen.

8voto

fedorqui Punkte 249453

I gerade entdeckt die Sie auch verwenden können "-d " :

cut "-d "

Test

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X