J'ai une ficelle au format suivant
id;some text here with possible ; inside
et voulez le scinder en 2 chaînes par la première occurrence de la ;
. Donc, ça devrait être: id
etsome text here with possible ; inside
Je sais comment scinder la chaîne (avec, par exemple cut -d ';' -f1
), mais elle se divisera en plusieurs parties puisque j'ai ;
la partie gauche.
bash
shell-script
string
split
Gakhov
la source
la source
id
etstring
Réponses:
cut
sonne comme un outil approprié pour cela:Mais
read
est encore plus approprié:la source
read
depuis que j'utilisebash
. Merci @ Manatwork!cut
approche ne fonctionnera que si "$ s" ne contient pas de caractères de nouvelle ligne. lu est dans n'importe quel shell Bourne-like. <<< est dans les versions rc, zsh et récente de bash et ksh93 et est celui qui n'est pas standard.-a
pour une raison quelconque en mentionnantbash
« sread
. (Évidemment d'aucune utilité ici.)-f 2-
dans lastring="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
commande. C'est ce qui ignore le reste des délimiteurs dans la chaîne pour l'impression. Pas évident quand on regarde la page de manuel decut
Avec n'importe quel sh standard (bash compris):
read
les solutions basées fonctionneraient pour des caractères uniques (et avec certains shells, un octet), des valeurs$sep
autres que espace, tabulation ou nouvelle ligne et uniquement si elles$s
ne contiennent pas de caractères de nouvelle ligne.cut
les solutions basées ne fonctionneraient que si elles$s
ne contenaient pas de caractères de nouvelle ligne.sed
des solutions pourraient être conçues pour traiter tous les cas$sep
critiques avec une valeur quelconque , mais cela ne vaut pas la peine d'aller aussi loin quand il y a un support intégré dans le shell pour cela.la source
Comme vous l'avez dit, vous voulez affecter les valeurs à id et string
assignez d'abord votre motif à une variable (disons str)
Maintenant, vous avez vos valeurs dans les variables respectives
la source
some_command
, votre modèle sera alors stocké dans $ 1 et utilisera le code ci-dessus avec 1 au lieu de strEn plus des autres solutions, vous pouvez essayer une solution
regex
:ou selon ce que vous essayez de faire exactement, vous pouvez utiliser
où
\1
et\2
contiennent les deux sous-chaînes que vous vouliez.la source
Solution en bash standard:
la source