Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中截断字符串_Linux_String_Bash_Truncate - Fatal编程技术网

Linux 在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

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

例如:00001_99_AA_FLLLA------>00001_99


如何在bash中执行此操作?

使用参数展开:

while [[ $string = *_*_* ]] ; do
    string=${string%_*}
done
  • ${string%\u*}
    从$string中删除最后一个uu及其后面的内容
  • 我们在$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
    的原因。没有一个答案链接到,所以它就在这里。