Bash 4.3在OS X上的子字符串负长度


12

Bash 4.2增加了对负子串长度的支持:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

示例37-12 字符串提取构造中的负参数

当“ length”参数为负数时,它用作“从端点偏移”参数。

例如,在Ubuntu上测试时,以下输出“ World”:

STR="Hello World!"
echo ${STR:6:-1}

但是在OS X(GNU bash,版本4.3.42(1)-发行版(x86_64-apple-darwin14.5.0))中,这种用法会产生以下错误:

-1: substring expression < 0

该OS X是特定的,还是在以后的bash更新中再次被禁用?有没有办法为OS X启用此功能?


1
tldp.org/LDP/abs/html/abs-guide.html#BASH2-从v2,v3和v4开始添加的内容。
汉奴

@Hannu是,该文件说,在4.2版本中加入的负面长度语义
布伦特浮士德

我也有同样的问题:您找到解决该问题的方法了吗?
罗曼·茹安

@romainjouin只需更改算法即可。即使在Bash 4.3.46版本中,此语法在OX X下也不起作用!投票赞成这个问题,以期引起更多关注。有人知道答案……
布伦特·浮士德·弗斯特

1
@Rubistro刚刚击中这个:| 解决它的一种方法是(在您的示例中)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Answers:


7

尽管flabdablet的解决方案仅适用于固定长度的字符串,但您可以将其用作动态大小的字符串的直接替代:

echo ${STR:6:$((${#STR} - 6 - 1))}

详细:

  • ${#STR} 返回字符串的长度。
  • $((a - b - c)) 做数学减法
  • ${STR:start:len} 返回一个子字符串。

因此,子字符串表达式的第二个参数的组合是字符串的长度减去起始偏移量再减去在较新的bash语法中指定为负值的值。


2

如果保证STR至少包含7个字符,则$ {STR:6:$ {#STR} -7}应该是$ {STR:6:-1}的有效替代。如果它可能更短,这也将导致OS X bash抱怨负长度,或者在支持负长度作为从右偏移的bash版本上犯了严重错误。


Thx,帮了我大忙
Jean-Bernard Jansen

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.