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 IFS
para 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 \1
lo que es el grupo de captura.(^|; )
Producción
file.001.txt ; file.0.98.txt ; file.14.txt