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 '':''
}
Si su último campo es un solo carácter, puede hacer esto:
a="1:2:3:4:5"
echo ${a: -1}
echo ${a:(-1)}
Compruebe la manipulación de cadenas en bash .
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