Divida uma string por vários delimitadores no bash

Divida uma string por vários delimitadores no bash

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 IFSpara 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 \1qual é o grupo de captura(^|; )

Saída

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

informação relacionada