我如何 parse/capture 由破折号分隔的字符串?
How can I parse/capture strings separated by dashes?
在 Bash shell 脚本中,我正在处理这样开始的数据:
string1-string2-string3-string4-etc
我需要将 string1
和 string2
分配给唯一变量,并将 string3-string4-etc
一起留在另一个唯一变量中。我尝试设置 IFS,但随后 string3
、string4
和 etc
断开连接。
如何获取我想要的数据?如果可能的话,我更喜欢内置 shell 命令,但是 gawk 或其他工具也很好。
使用剪切和命令替换来捕获字段
只要 -
字符始终是字段分隔符并且不嵌入任何子字符串,以下内容将起作用:
str='string1-string2-string3-string4-etc'
a=$(echo "$str" | cut -d- -f1)
b=$(echo "$str" | cut -d- -f2)
c=$(echo "$str" | cut -d- -f3-)
cut 实用程序使用破折号作为分隔符来定义要捕获的字段,Bash command substitution 用于将 cut 的输出分配给变量。
验证
$ echo "$a"; echo "$b"; echo "$c"
string1
string2
string3-string4-etc
使用内置的read
命令:
str='string1-string2-string3-string4-etc'
IFS=- read str1 str2 the_rest <<< "$str"
使用 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
在 Bash shell 脚本中,我正在处理这样开始的数据:
string1-string2-string3-string4-etc
我需要将 string1
和 string2
分配给唯一变量,并将 string3-string4-etc
一起留在另一个唯一变量中。我尝试设置 IFS,但随后 string3
、string4
和 etc
断开连接。
如何获取我想要的数据?如果可能的话,我更喜欢内置 shell 命令,但是 gawk 或其他工具也很好。
使用剪切和命令替换来捕获字段
只要 -
字符始终是字段分隔符并且不嵌入任何子字符串,以下内容将起作用:
str='string1-string2-string3-string4-etc'
a=$(echo "$str" | cut -d- -f1)
b=$(echo "$str" | cut -d- -f2)
c=$(echo "$str" | cut -d- -f3-)
cut 实用程序使用破折号作为分隔符来定义要捕获的字段,Bash command substitution 用于将 cut 的输出分配给变量。
验证
$ echo "$a"; echo "$b"; echo "$c"
string1
string2
string3-string4-etc
使用内置的read
命令:
str='string1-string2-string3-string4-etc'
IFS=- read str1 str2 the_rest <<< "$str"
使用 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