我在 bash 中有一个像这样的字符串:
*_*_*_*
其中 * 可以是任意数量的字母、数字和合法字符。
我需要将字符串截断为 *_*
。
示例为:00001_99_AA_FLLLA -----> 00001_99
如何在 bash 中执行此操作?
使用参数扩展:
while [[ $string = *_*_* ]] ; do
string=${string%_*}
done
${string%_*}
从 $string如果
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
中删除的字符串,然后将其删除。更详细:
x=_${s#*_*_}
这会将
x
设置为我们要从 s
中删除的字符串。 ${s#*_*_}
从 s
中删除包含两个下划线的最短字符串。 _${s#*_*_}
在前面加下划线
细绳。使用我们的例子: $ s=00001_99_AA_FLLLA; echo "_${s#*_*_}"
_AA_FLLLA
s=${s%$x}
这将从字符串
$x
的末尾删除 s
。这给了我们我们正在寻找的东西。使用我们的例子: $ echo "${s%$x}"
00001_99
如果要截断的字符串位于名为“myfile.txt”的文件中,在 bash 中,您始终可以这样做:
cut -d_ -f1,2 myfile.txt
第一个选项 -d_ 将指定下划线作为分隔字符,第二个选项 -f1,2 指定您希望(仅)返回字段 1 和 2。
因此,您可以将输出写入另一个文件,如下所示:
cut -d_ -f1,2 myfile.txt > 输出.txt