如何解析/捕获由破折号分隔的字符串?
Posted
技术标签:
【中文标题】如何解析/捕获由破折号分隔的字符串?【英文标题】:How can I parse/capture strings separated by dashes? 【发布时间】:2016-06-29 00:02:02 【问题描述】:在 Bash shell 脚本中,我正在处理这样开始的数据:
string1-string2-string3-string4-etc
我需要将string1
和string2
分配给唯一变量,并将string3-string4-etc
一起留在另一个唯一变量中。我尝试设置 IFS,但随后 string3
、string4
和 etc
断开连接。
我怎样才能得到我想要的数据?如果可能的话,我更喜欢内置的 shell 命令,但 gawk 或其他工具也可以。
【问题讨论】:
【参考方案1】:使用剪切和命令替换来捕获字段
只要-
字符始终是字段分隔符并且不嵌入任何子字符串中,以下将起作用:
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
【讨论】:
您正在为要提取的每个组件创建至少三个额外的进程表条目(运行echo
的子shell、cut
的副本和命令替换shell)方式 - 与让您已经运行的 shell 执行进程中的工作相比,效率非常低。【参考方案2】:
使用内置的read
命令:
str='string1-string2-string3-string4-etc'
IFS=- read str1 str2 the_rest <<< "$str"
【讨论】:
感谢您的所有回答!我选择这个作为答案是因为它使用内置的 shell 命令并且似乎是捕获数据的最有效方式。 @Gregg ,那么您应该通过单击答案左侧的勾号将答案标记为已接受...【参考方案3】:使用 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
【讨论】:
这对于对于基于read
的简单拆分来说过于复杂的情况非常有用。
同意。而且我不知道 BASH_REMATCH。现在用它来做一些不同的事情。谢谢你的回答!以上是关于如何解析/捕获由破折号分隔的字符串?的主要内容,如果未能解决你的问题,请参考以下文章