Чтобы разобрать поля с разделителями двоеточия, я могу использовать read
с пользовательским IFS
:
$ echo 'foo.c:41:switch (color) {' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 41 | switch (color) {
Если последнее поле содержит двоеточие, никаких проблем, двоеточия сохраняются.
$ echo 'foo.c:42:case RED: //alert' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 42 | case RED: //alert
Задерживающий разделитель также сохраняется...
$ echo 'foo.c:42:case RED: //alert:' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 42 | case RED: //alert:
... Если это не единственный дополнительный разделитель. Затем он лишился. Чего ждать?
$ echo 'foo.c:42:case RED:' | { IFS=: read file line text && echo "$file | $line | $text"; }
foo.c | 42 | case RED
Bash, ksh93 и dash все это делают, поэтому я предполагаю, что это стандартное поведение POSIX.
- Почему это происходит?
- Какая лучшая альтернатива?
Я хочу проанализировать строки выше на три переменные, и я не хочу калечить какой-либо текст в третьем поле. Я думал, что read
- это путь, но теперь я пересматриваю.