Há uma string:
onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt
Quero dividi-lo .
e ;
remover o prefixo antes do nome do arquivo, para que fique assim:
file.001.txt ; file.0.98.txt ; file.14.txt
Alguma ideia?
Responder1
sed -e 's/[^.]*.//' -e 's/;[^.]*./; /g'
Isso inicialmente remove a substring mais curta desde .
o início e então pode contar com ;
para operar na string resultante.
Responder2
Pegando o"na festa"literalmente, você poderia fazer algo assim.
divida a string em uma matriz, delimitada por ponto e vírgula
remova o prefixo elemento a elemento e armazene o resultado em uma string, delimitada pelo primeiro caractere de IFS
adicione globalmente espaços em branco atrás dos delimitadores
NOTA: você pode querer salvar a corrente IFS
para poder restaurá-la posteriormente.
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//;/; }"
doação
file.001.txt ; file.0.98.txt ; file.14.txt
Responder3
Ou com sed
...
s="onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
sed -E "s/(^|; )[^\.]+\./\1/g" <<<$s
Passo a passo
(^|; )[^\.]+\.
Encontre qualquer subelemento que comece no início da linha ^
ou |
com ;
(ponto e vírgula e um espaço) e que seja seguido por [^\.]+\.
, por exemplo, uma série contínua que não contém um literal .
, mas quefazterminar com um literal.
Em seguida, substitua tudo isso pelo \1
qual é o grupo de captura(^|; )
Saída
file.001.txt ; file.0.98.txt ; file.14.txt