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

Posted

技术标签:

【中文标题】如何解析/捕获由破折号分隔的字符串?【英文标题】:How can I parse/capture strings separated by dashes? 【发布时间】:2016-06-29 00:02:02 【问题描述】:

在 Bash shell 脚本中,我正在处理这样开始的数据:

string1-string2-string3-string4-etc

我需要将string1string2 分配给唯一变量,并将string3-string4-etc 一起留在另一个唯一变量中。我尝试设置 IFS,但随后 string3string4etc 断开连接。

我怎样才能得到我想要的数据?如果可能的话,我更喜欢内置的 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。现在用它来做一些不同的事情。谢谢你的回答!

以上是关于如何解析/捕获由破折号分隔的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

使用 lodash _.words 时如何不分隔破折号/连字符?

破折号分隔字符串中负值和正值的正则表达式

linux bash,驼峰式字符串用破折号分隔

删除特定分隔符后面的字符串的最后部分

如何将任意选项字符串解析为python字典

字符串 CSV解析 表格 逗号分隔值