我正在尝试从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