una sustituir script reemplazar manejo linea leer insertar fichero especiales eliminar caracteres caracter cadenas cadena añadir bash split tokenize cut

bash - sustituir - Cómo dividir una cadena en shell y obtener el último campo



sed reemplazar/ (14)

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


De una sola mano:

var1="1:2:3:4:5" var2=${var1##*:}

Otro, usando una matriz:

var1="1:2:3:4:5" saveIFS=$IFS IFS=":" var2=($var1) IFS=$saveIFS var2=${var2[@]: -1}

Otro más con una matriz:

var1="1:2:3:4:5" saveIFS=$IFS IFS=":" var2=($var1) IFS=$saveIFS count=${#var2[@]} var2=${var2[$count-1]}

Usando Bash (version> = 3.2) expresiones regulares:

var1="1:2:3:4:5" [[ $var1 =~ :([^:]*)$ ]] var2=${BASH_REMATCH[1]}


Es difícil obtener el último campo usando corte, pero aquí hay (un conjunto de) soluciones en awk y perl

$ echo 1:2:3:4:5 | awk -F: ''{print $NF}'' 5 $ echo 1:2:3:4:5 | perl -F: -wane ''print $F[-1]'' 5


Hay muchas respuestas buenas aquí, pero aún así quiero compartir esta usando el nombre base :

basename $(echo "a:b:c:d:e" | tr '':'' ''/'')

Sin embargo , fallará si ya hay algún ''/'' en tu cadena . Si slash / es tu delimitador, solo debes (y debes) usar basename.

No es la mejor respuesta, pero muestra cómo puedes ser creativo con los comandos de bash.


Otra forma es revertir antes y después del cut :

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

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


Para aquellos que se sienten cómodos con Python, https://github.com/Russell91/pythonpy es una buena opción para resolver este problema.

$ echo "a:b:c:d:e" | py -x ''x.split(":")[-1]''

De la ayuda de pythonpy: -x treat each row of stdin as x .

Con esa herramienta, es fácil escribir el código de Python que se aplica a la entrada.


Puede 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 '':'' }



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

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

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


Utilizando sed :

$ echo ''1:2:3:4:5'' | sed ''s/.*://'' # => 5 $ echo '''' | sed ''s/.*://'' # => (empty) $ echo '':'' | sed ''s/.*://'' # => (empty) $ echo '':b'' | sed ''s/.*://'' # => b $ echo ''::c'' | sed ''s/.*://'' # => c $ echo ''a'' | sed ''s/.*://'' # => a $ echo ''a:'' | sed ''s/.*://'' # => (empty) $ echo ''a:b'' | sed ''s/.*://'' # => b $ echo ''a::c'' | sed ''s/.*://'' # => c


Utilizando Bash.

$ var1="1:2:3:4:0" $ IFS=":" $ set -- $var1 $ eval echo /$${#} 0


una solución utilizando el construido de lectura

IFS='':'' read -a field <<< "1:2:3:4:5" echo ${field[4]}


$ echo "a b c d e" | tr '' '' ''/n'' | tail -1 e

Simplemente traduzca el delimitador a una nueva línea y elija la última entrada con la tail -1 .


echo "a:b:c:d:e"|xargs -d : -n1|tail -1

Primero use xargs divídalo usando ":", - n1 significa que cada línea solo tiene una parte. Luego, presione la última parte.


for x in `echo $str | tr ";" "/n"`; do echo $x; done