Shell lê * algumas vezes * delimitador à direita

Para analisar campos delimitados por dois pontos, posso usarread com um costumeIFS:

$ echo 'foo.c:41:switch (color) {' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 41 | switch (color) {

Se o último campo contiver dois pontos, não há problema, os dois pontos serão retido

$ echo 'foo.c:42:case RED: //alert' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 42 | case RED: //alert

Um delimitador à direita também é mantido ...

$ echo 'foo.c:42:case RED: //alert:' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 42 | case RED: //alert:

... A menos que seja os delimitador extra. Então é despojado.Espere o que

$ echo 'foo.c:42:case RED:' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 42 | case RED

Bash, ksh93 e dash fazem isso, então acho que é o comportamento padrão do POSI

Por que isso acontece? Qual é a melhor alternativa?

Eu quero analisar as strings acima em três variáveis e não quero alterar nenhum texto no terceiro campo. Eu penseiread era o caminho a seguir, mas agora estou reconsiderando.

questionAnswers(2)

yourAnswerToTheQuestion