Estoy usando una terminal Mac (bash) y tengo un archivo llamado data_list.txt
que contiene n
las siguientes líneas:
aaabbbccc_7777.txt
nnhhaa_8888.txt
ayquabay_9999.txt
ayqynbnbn_1122.txt
ooppaa_3454.txt
¿Cómo puedo eliminar los últimos 8 caracteres de cada línea?
Salida esperada de data_list.txt
:
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_
Gracias por cualquier ayuda
Respuesta1
Si deseas eliminar los últimos 8 caracteres, o todos si son menos de 8, puedes hacer:
sed "s/.\{0,8\}$//; /^$/d" data_list.txt
No hay necesidad de expresiones regulares extendidas. Esto borrará tantos caracteres como sea posible, pero no más de 8. Si eso deja una línea vacía, se eliminará de la salida.
Si necesita borrar cualquier espacio en blanco final (sin incluirlo en los 8 caracteres), puede hacer:
sed "s/.\{0,8\}[[:space:]]*$//" data_list.txt
Sólo puedo adivinar cuál es la condición real para lo que se debe eliminar al final (por ejemplo, todo lo que está después del guión bajo o un número + la extensión), pero si desea eliminar la extensión del archivo y los dígitos anteriores:
sed "s/[[:digit:]]*\..*$//" data_list.txt
Otras respuestas ya han mostrado cómo eliminar todo lo que está después del guión bajo, así que no lo repetiré.
Respuesta2
Para su entrada exacta (todas las líneas en sus extremos tienen espacios en blanco, excepto la última línea) puede usar esto (supongo que quiere deshacerse de 'después de la parte':
sed 's/........ *$//' data_list.txt
Para deshacerse de cualquier cosa después del último carácter 'subrayado', utilice este:
sed 's/\(.*_\).*$/\1/' data_list.txt
También funcionará en líneas que tengan múltiples caracteres 'subrayados', porque sed es 'codicioso'. Aunque no sé si esto funcionará en MacOS, al menos será útil para los usuarios de Linux que el motor de búsqueda de Google aterrizará aquí...
Respuesta3
Aquí hay una awk
solución que es tan rápida como el sed
enfoque de frippe, usando un archivo de ejemplo con 100.000 líneas:
time awk '{print substr($0, 1, length($0)-8)}' 100k.txt
real 0m4.110s
user 0m0.142s
sys 0m0.422s
time sed "s/.\{0,8\}$//; /^$/d" 100k.txt
real 0m4.043s
user 0m1.558s
sys 0m0.345s
Reemplace 8
con cualquier número. La principal diferencia aquí es que awk
imprimirá una nueva línea si la longitud de corte excede la longitud de la línea, mientras que sed
no.
Respuesta4
Usando Raku (anteriormente conocido como Perl_6)
raku -ne '.trim-trailing.chop(8).put;'
O
raku -pe '.=trim-trailing; .=chop(8);'
Entrada de muestra:
wxxyyyzzzz_1234.txt
aaabbbccc_7777.txt
nnhhaa_8888.txt
ayquabay_9999.txt
ayqynbnbn_1122.txt
ooppaa_3454.txt
Salida de muestra:
wxxyyyzzzz_
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_
Tenga en cuenta que ambas respuestas anteriores utilizan la trim-trailing
rutina de Raku para deshacerse de los espacios en blanco finales. Siéntase libre de eliminar trim-trailing
y/o ajustar el número de caracteres chop
-ped desde el extremo derecho de la cadena.