linux - mp3tag - Cómo encontrar el último campo usando ''cortar''
mp3 tag linux (11)
Esta es la única solución posible para usar nada más que cortar:
echo "cadena" | corte -d ''.'' -f2- [repeat_following_part_forever_or_until_out_of_memory:] | corte -d ''.'' -f2-
Usando esta solución, la cantidad de campos puede ser desconocida y variar de vez en cuando. Sin embargo, como la longitud de la línea no debe exceder los caracteres o campos de LINE_MAX, incluido el carácter de nueva línea, entonces un número arbitrario de campos nunca puede formar parte como una condición real de esta solución.
Sí, una solución muy tonta, pero la única que cumple con los criterios, creo.
Sin usar sed
o awk
, solo cut
, ¿cómo obtengo el último campo cuando el número de campos es desconocido o cambia con cada línea?
Hay múltiples formas. Puedes usar esto también.
echo "Your string here"| tr '' '' ''/n'' | tail -n1
> here
Obviamente, la entrada de espacio en blanco para el comando tr debe reemplazarse con el delimitador que necesita.
Me di cuenta de que si nos aseguramos de que exista un delimitador final, funciona. Así que en mi caso tengo delimitadores de coma y espacio en blanco. Añado un espacio al final; $ ans="a, b" $ ans+=" "; echo ${ans} | tr '','' '' '' | tr -s '' '' | cut -d'' '' -f2 b
No es posible usar solo cut
. Aquí hay una forma de usar grep
:
grep -o ''[^,]*$''
Reemplace la coma por otros delimitadores.
Podrías probar algo como esto:
echo ''maps.google.com'' | rev | cut -d''.'' -f 1 | rev
Explicación
- El reverso de maps.google.com será
moc.elgoog.spam
-
cut
usa un punto como delimitador y elige el primer campo, que esmoc
- por último, lo revertimos nuevamente (gracias por el recordatorio, @tom) para obtener
com
Puedes escribir un pequeño programa por bash shell.
Puede consultar mi shell bash https://www.huuphan.com/2018/06/split-string-in-shell-and-get-last-field.html
Espero que esto te haya ayudado!
Si su cadena de entrada no contiene barras diagonales, puede usar basename
y una subshell:
$ basename "$(echo ''maps.google.com'' | tr ''.'' ''/'')"
Esto no usa sed
o awk
pero tampoco usa cut
, así que no estoy muy seguro de si califica como una respuesta a la pregunta tal como está redactada.
Esto no funciona bien si se procesan cadenas de entrada que pueden contener barras diagonales. Una solución para esa situación sería reemplazar la barra diagonal con algún otro carácter que sepa que no forma parte de una cadena de entrada válida. Por ejemplo, el carácter de tubería ( |
) tampoco está permitido en los nombres de archivo, por lo que esto funcionaría:
$ basename "$(echo ''maps.google.com/some/url/things'' | tr ''/'' ''|'' | tr ''.'' ''/'')" | tr ''|'' ''/''
Si tiene un archivo llamado filelist.txt que es una lista de rutas como las siguientes: c: /dir1/dir2/file1.h c: /dir1/dir2/dir3/file2.h
entonces puedes hacer esto: rev filelist.txt | corte -d "/" -f1 | Rdo
Sin awk? ... Pero es tan simple con awk:
echo ''maps.google.com'' | awk -F. ''{print $NF}''
AWK es una herramienta mucho más poderosa para tener en tu bolsillo. -F si para el separador de campo NF es el número de campos (también representa el índice del último)
Utilice una expansión de parámetros. Esto es mucho más eficiente que cualquier tipo de comando externo, cut
(o grep
) incluido.
data=foo,bar,baz,qux
last=${data##*,}
Vea BashFAQ # 100 para una introducción a la manipulación de cadenas nativas en bash.
los siguientes implementos la sugerencia de un amigo
#!/bin/bash
rcut(){
nu="$( echo $1 | cut -d"$DELIM" -f 2- )"
if [ "$nu" != "$1" ]
then
rcut "$nu"
else
echo "$nu"
fi
}
$ export DELIM=.
$ rcut a.b.c.d
d