Cómo dividir una cadena en Shell y obtener el último campo

Resuelto cd1 asked hace 14 años • 17 respuestas

Supongamos que tengo la cadena 1:2:3:4:5y quiero obtener su último campo ( 5en este caso). ¿Cómo hago eso usando Bash? Lo intenté cut, pero no sé cómo especificar el último campo con -f.

cd1 avatar Jul 02 '10 06:07 cd1
Aceptado

Puedes utilizar operadores de cadena :

$ foo=1:2:3:4:5
$ echo ${foo##*:}
5

Esto recorta todo desde el frente hasta un ':', con avidez.

${foo  <-- from variable foo
  ##   <-- greedy front trim
  *    <-- matches anything
  :    <-- until the last ':'
 }
Stephen avatar Jul 02 '2010 00:07 Stephen

Otra forma es invertir el antes y el después cut:

$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef

Esto hace que sea muy fácil obtener el penúltimo campo, o cualquier rango de campos numerados desde el final.

a3nm avatar Feb 03 '2012 08:02 a3nm

Es difícil obtener el último campo usando cut, pero aquí hay algunas soluciones en awk y perl.

echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
William Pursell avatar Jul 02 '2010 07:07 William Pursell

Suponiendo un uso bastante simple (sin escape del delimitador, por ejemplo), puedes usar grep:

$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5

Desglose: busque todos los caracteres, excepto el delimitador ([^:]) al final de la línea ($). -o solo imprime la parte coincidente.

Nicholas M T Elliott avatar Jul 01 '2010 23:07 Nicholas M T Elliott

Podrías probar algo como esto si quieres usar cut:

echo "1:2:3:4:5" | cut -d ":" -f5

También puedes usar grepintentarlo así:

echo " 1:2:3:4:5" | grep -o '[^:]*$'
Abdallah_98 avatar Feb 06 '2021 09:02 Abdallah_98