Dividir una cadena por múltiples delimitadores en bash

Dividir una cadena por múltiples delimitadores en bash

Hay una cadena:

onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt

Quiero dividirlo .y ;eliminar el prefijo antes del nombre del archivo, para que se vea así:

file.001.txt ; file.0.98.txt ; file.14.txt

¿Algunas ideas?

Respuesta1

sed -e 's/[^.]*.//' -e 's/;[^.]*./; /g'

Inicialmente, esto elimina la subcadena más corta desde .el principio y luego puede confiar en ella ;para operar en la cadena resultante.

Respuesta2

Tomando el"en bash"literalmente, podrías hacer algo como esto.

  • dividir la cadena en una matriz, delimitada por punto y coma

  • elimine el prefijo por elementos y almacene el resultado en una cadena, delimitada por el primer carácter de IFS

  • agregar globalmente espacios en blanco detrás de los delimitadores

NOTA: es posible que desee guardar el archivo actual IFSpara poder restaurarlo después.

IFS=";"
read -a arr <<< "onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
printf -v str "${arr[*]#*.}"
printf "%s\n" "${str//;/; }"

dando

file.001.txt ; file.0.98.txt ; file.14.txt

Respuesta3

O con sed...

s="onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
sed -E "s/(^|; )[^\.]+\./\1/g" <<<$s

Tutorial

(^|; )[^\.]+\.

Encuentre cualquier subelemento que comience al principio de la línea ^o |con ;(punto y coma y un espacio) y que esté seguido, por [^\.]+\.ejemplo, de una serie continua que no contenga un literal .pero quehaceterminar con un literal.

Luego reemplace todo eso con \1lo que es el grupo de captura.(^|; )

Producción

file.001.txt ; file.0.98.txt ; file.14.txt

información relacionada