【发布时间】:2018-10-11 14:09:31
【问题描述】:
要解析冒号分隔的字段,我可以使用 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:
...除非它是 only 额外的分隔符。然后它被剥离。 等等,什么?
$ 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 是可行的方法,但现在我正在重新考虑。
【问题讨论】:
-
Stéphane Chazelas's answer on Unix.SE 回答了我的第一个问题的一部分,尽管我仍然不清楚这种行为是否合理或仅仅是一个丑陋的历史缺陷。
-
我在spec for
read中没有看到任何表明应删除尾随字段分隔符的内容。 -
您可以主动将包含
:的 cmets 附加到您的代码中。 -
查看 bash 源代码
builtins/read.def我发现以下注释:Posix.2 表示最后一个变量获取剩余的单词及其中间的分隔符。 这只是在包含对函数strip_trailing_ifs_whitespace的调用的条件之前。