【发布时间】:2021-03-13 06:20:00
【问题描述】:
我在 Bash 中有一个字符串,它可能以也可能不以任意数量的前导空格开头,例如
" foo bar baz"
" foo bar baz"
"foo bar baz"
我想从字符串中删除“foo”的第一个实例,以及任何前导空格(可能没有)。
根据this question 的建议,我尝试了以下方法:
str=" foo bar baz"
regex="[[:space:]]*foo"
echo "${str#$regex}"
echo "${str#[[:space:]]*foo}"
如果 str 有 一个或多个 前导空格,那么它将返回我想要的结果,即 _bar baz(下划线 = 前导空格)。如果字符串有 no 前导空格,它将不执行任何操作并返回 foo bar baz。两个“回声”在这里返回相同的结果。
我的理解是在[[:space:]] 之后使用* 应该匹配零 个或多个[[:space:]] 实例,而不是一个或多个。我在这里遗漏了什么或做错了什么?
编辑
@Raman - 我尝试了以下方法,但它们也不起作用:
echo "${str#[[:space:]]?foo}"
echo "${str#?([[:space:]])foo}"
echo "${str#*([[:space:]])foo}"
无论是否有尾随空格,所有三个解决方案都不会删除 'foo'。唯一可行的解决方案是我用星号发布的解决方案 - 当有尾随空格时它将删除“foo”,但在没有尾随空格时不会。
【问题讨论】:
-
@RamanSailopal docs at GNU 表示
?匹配零个或一个匹配项,*匹配零个或多个匹配项。无论如何我都试过了,但没有用 - 将更新问题。 -
and they also don't work:启用 extglob... -
${str#*foo}有什么问题? -
@oguzismail 在
str=oguzfoo的情况下,我猜 op 不想匹配。 -
@Lou:只是为了确保这不是 XY 问题:您是否要在空格处拆分字符串?如果是这种情况,您应该改用:
read -ra ary -d '' < <(printf '%s\0' "$str"),并且您将拥有数组ary中的令牌。
标签: string bash removing-whitespace parameter-expansion