Bash:仅在特定字符后将IFS设置为Space?

时间:2017-08-31 12:11:55

标签: arrays bash ifs

我使用IFS=', '将逗号分隔的文本字符串拆分为数组。问题是偶尔有一个以逗号分隔的项目包含:之后的空格。结果数组包含该项作为两个单独的数组元素。是否可以将IFS设置为仅拆分', '并忽略包含': '(或任何其他字符)的逗号分隔项?

请参阅下面第一个命令返回的逗号分隔字符串,请注意第二个项目包含:。请参阅MarkerNames[1] and MarkerNames[2]以查看下面第二个命令中的不需要的拆分。

$ exiftool -s3 -TracksMarkersName audioFile.wav
Marker1, Tempo: 120.0, Silence, Marker2, Silence.1, Marker3, Silence.2, Marker4, Silence.3, Marker5

$ IFS=', ' read -r -a MarkerNames <<< $(exiftool -s3 -TracksMarkersName audioFile.wav)
$ declare -p MarkerNames
declare -a MarkerNames='([0]="Marker1" [1]="Tempo:" [2]="120.0" [3]="Silence" [4]="Marker2" [5]="Silence.1" [6]="Marker3" [7]="Silence.2" [8]="Marker4" [9]="Silence.3" [10]="Marker5")'

2 个答案:

答案 0 :(得分:2)

IFS包含每个可以作为字段分隔符的字符的枚举。所以", "说“任何空格或逗号都会分隔我的字段”。

我认为最简单的解决方法是预处理输出,以便在需要的地方获得休息时间。

IFS='~' MarkerNames=($(exiftool -s3 -TracksMarkersName audioFile.wav | sed 's/, /~/g'))

这当然要求您找到数据中未出现的另一个IFS值。如果Bash 4+可用,可以使用换行符readarray

答案 1 :(得分:0)

您可以在逗号上拆分并删除前导/尾随空格:

create: