Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
BASH:如何在指定字符+;2个字符?_Bash - Fatal编程技术网

BASH:如何在指定字符+;2个字符?

BASH:如何在指定字符+;2个字符?,bash,Bash,我在bash中有一个字符串,如下所示: 123.123123 123.1 123 我想要这个结果: 123.12 123.1 123 因此,如何将每行修剪为指定字符+最多2个额外字符?您可以使用expr的正则表达式功能来实现此目的: expr "$string" : '\(.*[.]..\)' 请尝试以下代码: #!/bin/bash string="1234.12345" pos=`expr index $string .` echo $pos substring= expr sub

我在bash中有一个字符串,如下所示:

123.123123
123.1
123
我想要这个结果:

123.12
123.1
123

因此,如何将每行修剪为指定字符+最多2个额外字符?

您可以使用
expr
的正则表达式功能来实现此目的:

expr "$string" : '\(.*[.]..\)'
请尝试以下代码:

#!/bin/bash

string="1234.12345"

pos=`expr index $string .`
echo $pos
substring= expr substr $string 1 $((pos+2))
echo $substring
这样,您将使用
expr index$string
获得点
的位置,然后使用
expr substr$string 1$((pos+2))
(从char 1到char$pos+2的子字符串)获得子字符串

有用链接:

编辑: 可能使用@Martin Valgur建议的正则表达式要短得多:

string="1234.12345"
substring= expr "$string" : '\(.*[.]..\)'
echo $substring
在bash中,使用字符串索引。您可以将字符串int拆分为所需的每个字符。只需选择要捕获的索引。例如:

myvar=123.123123 123.1 123
echo ${myvar:0:6}    # 123.12
echo ${myvar:11:5}   # 123.1
echo ${myvar:17:3}   # 123
您可以轻松地将其组合为:

echo "${myvar:0:6} echo ${myvar:11:5} echo ${myvar:17:3}"
# result: 123.12 123.1 123
或从字符串末尾开始:

echo ${myvar: -3}    # 123

注意:要从字符串末尾开始编制索引,您可以在负数之前留一个空格或将其放在括号中(例如
${myvar:-2}
=
23
,或
${myvar:-3}
=
123

对于更新的需求,您可以使用此sed

sed 's/\(\.[^ ]\?[^ ]\?\)[^ ]*/\1/g'
例子
指定了什么字符
grep-o.“*\…”
?您指定了哪个字符?@TomFenech根据输入和输出判断,我假设
谢谢,我编辑了这个问题。字符串中的数字是整数,点后只有一位数字。如果你要向下投票,请诚实地指出你认为这篇文章有什么问题?我的猜测是它使用硬编码长度,不允许你指定字符。最初的问题是我如何像这样拆分这个字符串。。。。。我现在明白了,他想要一个算法,而不仅仅是我如何分割它:)这对echo 123.123123 | sed的/\(\.[^]\?[^]\?[^]\?\)[^]*/\1/g'@IAN2TEDV不管用……你说得对,我认为它应该产生
123.123
,我的坏!当我可以的时候提高投票率:)@ian2tedv你是什么意思?
echo 123.123123 123.1 123 | sed 's/\(\.[^ ]\?[^ ]\?\)[^ ]*/\1/g'

123.12 123.1 123