如何解析/捕获由破折号分隔的字符串?

时间:2016-03-14 03:50:21

标签: string bash parsing field variable-assignment

在Bash shell脚本中,我处理的数据如下所示:

string1-string2-string3-string4-etc

我需要将string1string2分配给唯一变量,并将string3-string4-etc放在另一个唯一变量内。我试图设置IFS,然后string3string4etc已断开连接。

如何获取我想要的数据?如果可能的话,我更喜欢内置shell命令,但gawk或其他工具也很好。

3 个答案:

答案 0 :(得分:11)

使用内置read命令:

str='string1-string2-string3-string4-etc'
IFS=- read str1 str2 the_rest <<< "$str"

答案 1 :(得分:7)

使用剪切和命令替换来捕获字段

只要-字符始终是字段分隔符并且未嵌入任何子字符串中,以下内容将起作用:

str='string1-string2-string3-string4-etc'
a=$(echo "$str" | cut -d- -f1)
b=$(echo "$str" | cut -d- -f2)
c=$(echo "$str" | cut -d- -f3-)

剪切实用程序使用短划线作为分隔符来定义要捕获的字段,Bash command substitution用于将剪切输出分配给变量。

验证

$ echo "$a"; echo "$b"; echo "$c"
string1
string2
string3-string4-etc

答案 2 :(得分:2)

使用Bash正则表达式:

s=string1-string2-string3-string4-etc
pat="([^-]*)-([^-]*)-(.*)"
[[ $s =~ $pat ]]
echo "${BASH_REMATCH[1]}"
echo "${BASH_REMATCH[2]}"
echo "${BASH_REMATCH[3]}"

输出:

string1
string2
string3-string4-etc