Linux 在bash中截断字符串
我在bash中有这样一个字符串:Linux 在bash中截断字符串,linux,string,bash,truncate,Linux,String,Bash,Truncate,我在bash中有这样一个字符串:*.*.*.*.其中*可以是任意数量的字母、数字和合法字符。 我需要将字符串截断为*.* 例如:00001_99_AA_FLLLA------>00001_99 如何在bash中执行此操作?使用参数展开: while [[ $string = *_*_* ]] ; do string=${string%_*} done ${string%\u*}从$string中删除最后一个uu及其后面的内容 我们在$string至少包含两个下划线时执行此操作 如果s
*.*.*.*.
其中*可以是任意数量的字母、数字和合法字符。
我需要将字符串截断为*.*
例如:00001_99_AA_FLLLA------>00001_99
如何在bash中执行此操作?使用参数展开:
while [[ $string = *_*_* ]] ; do
string=${string%_*}
done
从$string中删除最后一个uu及其后面的内容${string%\u*}
- 我们在$string至少包含两个下划线时执行此操作
s
是您的字符串,请尝试:
x=_${s#*_*_}
s=${s%$x}
这种方法有两个优点:(1)它不需要循环,因此速度很快;(2)它是POSIX,因此可移植到任何与POSIX兼容的shell
例子
$s=00001\u 99\u AA\u FLLLA
$x={s}*.*.};s=${s%$x}
$echo“$s”
00001_99
工作原理
此代码分两步工作:首先,我们找到要从s
中删除的字符串,然后将其删除。更详细地说:
x={s}*.*.}
这将x
设置为要从s
中删除的字符串${s#*.*.}
从s
中删除包含两个下划线的最短字符串{s#*.*.}
在前面加下划线
一串以我们的例子:$s=00001\u 99\u AA\u FLLLA;回声“${s#*.*.}”
_阿乌·费拉
s=${s%$x}
这将从字符串s
的末尾删除$x
。这给了我们想要的东西。以我们的例子:$echo“${s%$x}”
00001_99
我看到我们所有人,包括OP和2个答案,都有匿名投票人的访问。谢谢你的回复。不幸的是,我不能投票支持你的答案,但这对我很有效。简单问一下:为什么x=${s#**}返回AA#u FLLLA而不是00001_99?我不清楚它是如何工作的。@user3708408表示前缀删除的
和表示后缀删除的%
之间有区别${s#*.*.}
从s
的开头删除。相反,${s%\u*\ u*}
从s
的末尾删除。这就是为什么${s#*.*.*.}
返回AA_FLLLA
而不是00001_99
的原因。没有一个答案链接到,所以它就在这里。