it-swarm.com.de

Teilen der Zeichenfolge durch das erste Auftreten eines Trennzeichens

Ich habe eine Zeichenfolge im nächsten Format

id;some text here with possible ; inside

und möchten es durch das erste Auftreten des ; in 2 Zeichenfolgen aufteilen. Also sollte es sein: id und some 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 habe.

57
gakhov

cut klingt nach einem geeigneten Werkzeug dafür:

bash-4.2$ s='id;some text here with possible ; inside'

bash-4.2$ id="$( cut -d ';' -f 1 <<< "$s" )"; echo "$id"
id

bash-4.2$ string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
some text here with possible ; inside

Aber read ist noch besser geeignet:

bash-4.2$ IFS=';' read -r id string <<< "$s"

bash-4.2$ echo "$id"
id

bash-4.2$ echo "$string"
some text here with possible ; inside
74
manatwork

Mit jedem Standard-Sh (einschließlich Bash):

sep=';'
case $s in
  (*"$sep"*)
    before=${s%%"$sep"*}
    after=${s#*"$sep"}
    ;;
  (*)
    before=$s
    after=
    ;;
esac

read -basierte Lösungen funktionieren für Einzelzeichenwerte (und mit einigen Shells für Einzelbytes) von $sep außer Leerzeichen, Tabulatoren oder Zeilenumbrüchen und nur dann, wenn $s dies nicht tut Zeilenumbruchzeichen enthalten.

cut -basierte Lösungen würden nur funktionieren, wenn $s keine Zeilenumbrüche enthält.

Es könnten sed -Lösungen entwickelt werden, die alle Eckfälle mit einem Wert von $sep behandeln, aber es lohnt sich nicht, so weit zu gehen, wenn die Shell dafür Unterstützung bietet.

18

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).

    str='id;some text here with possible ; inside'
    id=${str%%;} 
    string=${str#;}

Jetzt haben Sie Ihre Werte in entsprechenden Variablen

6
user1678213

Zusätzlich zu den anderen Lösungen können Sie etwas regex -basiertes ausprobieren:

a="$(sed 's/;.*//' <<< "$s")"
b="$(sed 's/^[^;]*;//' <<< "$s")"

oder je nachdem, was Sie genau versuchen, können Sie verwenden

sed -r 's/^([^;]*);(.*)/\1 ADD THIS TEXT BETWEEN YOUR STRINGS \2/'

wo \1 und \2 enthalten die beiden gewünschten Teilzeichenfolgen.

4
tojrobinson

Lösung in Standard-Bash:

    text='id;some text here with possible ; inside'
    text2=${text#*;}
    text1=${text%"$text2"}

    echo $text1
    #=> id;
    echo $text2
    #=> some text here with possible ; insideDD
3
ethaning