tag mp3tag kid3 editar easytag linux bash cut

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 es moc
  • por último, lo revertimos nuevamente (gracias por el recordatorio, @tom) para obtener com


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