Ich habe eine Zeichenfolge im nächsten Format
id;some text here with possible ; inside
und wollen es nach dem ersten Auftreten der in 2 Zeichenketten aufteilen ;
. So sollte es sein: id
undsome text here with possible ; inside
Ich weiß, wie man den String teilt (zum Beispiel mit cut -d ';' -f1
), aber er wird in mehr Teile geteilt, da ich ;
im linken Teil bin .
bash
shell-script
string
split
Gakhov
quelle
quelle
id
undstring
Antworten:
cut
klingt nach einem geeigneten Werkzeug dafür:Ist
read
aber noch besser geeignet:quelle
read
da ich es benutzebash
. Vielen Dank an @manatwork!cut
Ansatz funktioniert nur, wenn "$ s" keine Zeilenumbrüche enthält. read befindet sich in einer beliebigen Bourne-ähnlichen Shell. <<< ist in rc, zsh und den neuesten Versionen von bash und ksh93 und ist diejenige, die nicht Standard ist.-a
aus irgendeinem Grunde , wenn erwähnenbash
‚sread
. (Offensichtlich-f 2-
in demstring="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
Befehl. Dies ist, was den Rest der Begrenzer in der Zeichenfolge für den Ausdruck ignoriert. Nicht offensichtlich, wenn man sich die Manpage voncut
Mit jedem Standard-Sh (einschließlich Bash):
read
basierte Lösungen funktionieren für einzelne Zeichen (und bei einigen Shells auch für$sep
Einzelbyte- Werte),$s
die keine Leerzeichen, Tabulatoren oder Zeilenumbrüche enthalten und nur dann, wenn sie keine Zeilenumbrüche enthalten.cut
basierte Lösungen funktionieren nur, wenn$s
sie keine Zeilenumbrüche enthalten.sed
Es könnten Lösungen entwickelt werden, die alle$sep
Eckfälle mit einem beliebigen Wert von abdecken, aber es lohnt sich nicht, so weit zu gehen, wenn die Shell dafür eine integrierte Unterstützung bietet.quelle
Wie Sie bereits erwähnt haben, möchten Sie die Werte id und string zuweisen
Weisen Sie Ihr Muster zunächst einer Variablen zu (z. B. str).
Jetzt haben Sie Ihre Werte in entsprechenden Variablen
quelle
some_command
, dann wird Ihr Muster in $ 1 gespeichert und verwenden Sie den obigen Code mit 1 anstelle von strZusätzlich zu den anderen Lösungen können Sie Folgendes ausprobieren
regex
:oder je nachdem, was Sie genau versuchen, können Sie verwenden
wo
\1
und\2
enthalten Sie die beiden gewünschten Teilzeichenfolgen.quelle
Lösung in Standard-Bash:
quelle