在bash中截断一个字符串

时间:2018-04-11 22:06:14

标签: linux string bash truncate

我在bash中有这样的字符串:*_*_*_*其中*可以是任意数量的字母,数字和合法字符。 我需要将字符串截断为*_*

一个例子是:00001_99_AA_FLLLA -----> 00001_99

我怎样才能在bash中执行此操作?

2 个答案:

答案 0 :(得分:1)

使用参数扩展:

while [[ $string = *_*_* ]] ; do
    string=${string%_*}
done
  • ${string%_*}从$ string
  • 中移除最后一个_及其后的内容
  • 我们这样做,而$ string包含至少两个下划线

答案 1 :(得分:0)

如果s是您的字符串,请尝试:

x=_${s#*_*_}
s=${s%$x}

这种方法有两个优点:(1)它不需要任何可以使其快速的循环,以及(2)它是POSIX,因此可移植到任何POSIX兼容的shell。

实施例

$ s=00001_99_AA_FLLLA
$ x=_${s#*_*_}; s=${s%$x}
$ echo "$s"
00001_99

如何运作

此代码分为两步:首先,我们找到要从s中删除的字符串,然后将其删除。更详细:

  1. x=_${s#*_*_}

    这会将x设置为我们要从s中删除的字符串。 ${s#*_*_}s中删除包含两个下划线的最短字符串。 _${s#*_*_}在其前面加上了下划线 串。使用我们的示例:

  2.     $ s=00001_99_AA_FLLLA; echo "_${s#*_*_}"
        _AA_FLLLA
    
    1. s=${s%$x}

      这会从字符串$x的末尾删除s。这给了我们正在寻找的东西。使用我们的示例:

    2.     $ echo "${s%$x}"
          00001_99