Tengo una cadena en el siguiente formato
id;some text here with possible ; inside
y desea dividirlo en 2 cadenas por primera aparición de ;
. Entonces, debería ser: id
ysome text here with possible ; inside
Sé cómo dividir la cadena (por ejemplo, con cut -d ';' -f1
), pero se dividirá en más partes ya que tengo ;
dentro de la parte izquierda.
bash
shell-script
string
split
gakhov
fuente
fuente
id
ystring
Respuestas:
cut
Suena como una herramienta adecuada para esto:Pero
read
es aún más adecuado:fuente
read
puesto que estoy usandobash
. Gracias @manatwork!cut
enfoque solo funcionará cuando "$ s" no contenga caracteres de nueva línea. leer está en cualquier shell similar a Bourne. <<< está en rc, zsh y versiones recientes de bash y ksh93 y es el que no es estándar.-a
alguna razón al mencionarbash
la deread
. (Evidentemente no sirve de nada aquí)-f 2-
en elstring="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
comando. Esto es lo que ignora el resto de los delimitadores en la cadena para la impresión. No es evidente cuando se mira en la página del manual decut
Con cualquier estándar sh (incluyendo bash):
read
las soluciones basadas funcionarían para valores de un solo carácter (y con algunos shells, de un solo byte)$sep
distintos de espacio, tabulación o nueva línea y solo si$s
no contienen caracteres de nueva línea.cut
Las soluciones basadas solo funcionarían si$s
no contienen caracteres de nueva línea.sed
podrían idearse soluciones que manejen todos los casos de esquina con cualquier valor de$sep
, pero no vale la pena ir tan lejos cuando hay soporte incorporado en el shell para eso.fuente
Como mencionó que desea asignar los valores a id y string
primero asigne su patrón a una variable (digamos str)
Ahora tienes tus valores en las variables respectivas
fuente
some_command
, entonces su patrón se almacenará en $ 1 y usará el código anterior con 1 en lugar de strAdemás de las otras soluciones, puede probar algo
regex
basado:o dependiendo de lo que intente hacer exactamente, podría usar
dónde
\1
y\2
contener las dos subcadenas que estabas deseando.fuente
Solución en bash estándar:
fuente