如何在bash中从“foo-bar-baz”中提取“foo”?

如何在bash中从“foo-bar-baz”中提取“foo”?

我正在尝试从bash 中的foo字符串中提取内容。"foo-bar-baz"

任何想法如何使用字符串替换或类似的东西(无需外部工具)来做到这一点。

我尝试了这个但没有成功:

$ str="foo-bar-baz"
$ echo ${str%-*}
foo-bar

这也不起作用:

$ str="foo-bar-baz"
$ echo ${str#*-}
bar-baz

有什么想法如何获得公正bar吗?

答案1

$ str="foo-bar-baz"

$ echo "${str%%-*}"
foo

$ echo "${str##*-}"
baz

$ var="${str#*-}"
$ echo "$var"
bar-baz
$ echo "${var%-*}"
bar

答案2

这可能会从字符串中提取 foo 。

$ str="foo-bar-baz"
str= ${str%-*} #this will get the part foo-bar
str= ${str%-*} #this will fetch foo from the string foo-bar
echo $str

答案3

@heemayl 已经给出了正确的答案,但要添加参考和解释:

man bash

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce a pattern just  as  in  pathname  expansion.   If  the  pattern
          matches a trailing portion of the expanded value of parameter, then the result of the expansion is the expanded value of parame-
          ter with the shortest matching pattern (the ‘‘%’’ case) or the longest matching pattern (the ‘‘%%’’ case) deleted.

您只使用了一个%符号,因此删除了最短的匹配项而不是最长的匹配项。

作为旁注,我最近读到了一个非常准确的观察结果,即学习bash和不学习的人awk通常最终会用于bash文本处理工作完全错误的工具。我在大约 5 小时内(一个晚上和一个早上)学会了 90% 的内容awk(除了更高级的功能之外的所有内容)。

如果您所做的只是删除这个字符串以用作文件名或命令参数或其他东西,那么当然没问题,这就是该功能存在的原因bash。然而,如果你正在做更高级和复杂的字符串杂耍,我高度建议花一天时间学习awk。它将获得数十倍的回报。

(我提到这一点主要是因为你的标签看起来可能比字符串杂耍awk对你有更大的帮助。)bash

相关内容