Ich möchte ein Leerzeichen als Begrenzungszeichen mit der cut
Befehl.
Welche Syntax kann ich dafür verwenden?
Ich möchte ein Leerzeichen als Begrenzungszeichen mit der cut
Befehl.
Welche Syntax kann ich dafür verwenden?
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}'
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 :
-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 :
'...'
wird genommen buchstäblich und bildet eine einzeln Argument"..."
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.'...'
o "..."
o \
Instanzen) - also, der aufgerufene Befehl sieht nie die Anführungszeichen .I gerade entdeckt die Sie auch verwenden können "-d "
:
cut "-d "
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
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.