在 bash 中截断字符串

问题描述 投票:0回答:3

我在 bash 中有一个像这样的字符串:

*_*_*_*
其中 * 可以是任意数量的字母、数字和合法字符。 我需要将字符串截断为
*_*

示例为:00001_99_AA_FLLLA -----> 00001_99

如何在 bash 中执行此操作?

linux string bash truncate
3个回答
2
投票

使用参数扩展:

while [[ $string = *_*_* ]] ; do
    string=${string%_*}
done
  • ${string%_*}
    从 $string
  • 中删除最后一个 _ 及其后面的内容
  • 我们在 $string 包含至少两个下划线时执行此操作

2
投票

如果

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#*_*_}
    在前面加下划线 细绳。使用我们的例子:

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

    这将从字符串

    $x
    的末尾删除
    s
    。这给了我们我们正在寻找的东西。使用我们的例子:

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

0
投票

如果要截断的字符串位于名为“myfile.txt”的文件中,在 bash 中,您始终可以这样做:

cut -d_ -f1,2 myfile.txt

第一个选项 -d_ 将指定下划线作为分隔字符,第二个选项 -f1,2 指定您希望(仅)返回字段 1 和 2。

因此,您可以将输出写入另一个文件,如下所示:

cut -d_ -f1,2 myfile.txt > 输出.txt

© www.soinside.com 2019 - 2024. All rights reserved.