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? Lo intenté cut
, pero no sé cómo especificar el último campo con -f
.
293
Puede usar 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 ':'
}
5
si la cadena lo es1:2:3:4:5:
(al usar los operadores de cadena se obtiene un resultado vacío). Esto es especialmente útil al analizar rutas que podrían contener (o no) un/
carácter final .${foo%:*}
.#
- desde el principio;%
- desde el final.#
,%
- partido más corto;##
,%%
- partido más largo.echo ${pwd##*/}
No funciona.pwd
como una variable. Tratardir=$(pwd); echo ${dir##*/}
. ¡Funciona para mi!Otra forma es revertir antes y después
cut
:Esto hace que sea muy fácil obtener el último pero un campo, o cualquier rango de campos numerados desde el final.
fuente
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
era justo lo que necesitaba!cut -b20- | rev | cut -b10- | rev
Es difícil obtener el último campo usando cortar, pero aquí hay algunas soluciones en awk y perl
fuente
/
carácter final :/a/b/c/d
y/a/b/c/d/
producen el mismo resultado (d
) al procesarpwd | awk -F/ '{print $NF}'
. La respuesta aceptada da como resultado un resultado vacío en el caso de/a/b/c/d/
/
como delimitador, y si su ruta es/my/path/dir/
, usará el valor después del último delimitador, que es simplemente una cadena vacía. Por lo tanto, es mejor evitar la barra diagonal final si necesita hacer algo como yo.awk '{$NF=""; print $0}' FS=: OFS=:
menudo funciona lo suficientemente bien.Suponiendo un uso bastante simple (sin escapar del delimitador, por ejemplo), puede usar grep:
Desglose: encuentre todos los caracteres, no el delimitador ([^:]) al final de la línea ($). -o solo imprime la parte correspondiente.
fuente
De una sola mano:
Otro, usando una matriz:
Otro más con una matriz:
Usando expresiones regulares Bash (versión> = 3.2):
fuente
Simplemente traduzca el delimitador a una nueva línea y elija la última entrada con
tail -1
.fuente
\n
, pero para la mayoría de los casos es la solución más fácil de leer.Utilizando
sed
:fuente
Si su último campo es un solo carácter, puede hacer esto:
Verifique la manipulación de cadenas en bash .
fuente
a
, no el último campo .Aquí hay muchas buenas respuestas, pero aún quiero compartir esta usando basename :
Sin embargo , fallará si ya hay algunos '/' en su cadena . Si slash / es su delimitador, entonces solo tiene que (y debería) usar basename.
No es la mejor respuesta, pero solo muestra cómo puedes ser creativo usando los comandos bash.
fuente
Usando Bash.
fuente
echo ${!#}
lugar deeval echo \$${#}
.Primero use xargs dividiéndolo usando ":", - n1 significa que cada línea solo tiene una parte. Luego, presione la última parte.
fuente
fuente
Para aquellos que se sienten cómodos con Python, https://github.com/Russell91/pythonpy es una buena opción para resolver este problema.
De la ayuda pythonpy:
-x treat each row of stdin as x
.Con esa herramienta, es fácil escribir código python que se aplica a la entrada.
fuente
Puede ser un poco tarde con la respuesta, aunque una solución simple es invertir el orden de la cadena de entrada. Esto le permitiría obtener siempre el último elemento sin importar la longitud.
Sin embargo, es importante tener en cuenta que si usa este método y los números tienen más de 1 dígito (o más de un carácter en cualquier circunstancia), deberá ejecutar otro comando 'rev' sobre la salida canalizada.
Espero poder ayudar, salud
fuente
Una solución usando la lectura incorporada:
O, para hacerlo más genérico:
fuente
Si le gusta python y tiene una opción para instalar un paquete, puede usar esta utilidad python .
fuente
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
paquete es hacer que hagas lo mismo quepython -c
con menos tipos de caracteres. Eche un vistazo al archivo README en el repositorio.La coincidencia de expresiones regulares en
sed
es codiciosa (siempre va a la última aparición), que puede utilizar para su ventaja aquí:fuente