正则表达式 - 删除除2位数之外的所有数字

时间:2014-12-03 18:33:58

标签: regex bash sed

如果你有以下字符串,你会如何将它们减少到前两位?

FOO='1.2.3'
BAR='4.5.6.7x'

期望的输出

FOO='1.2'
BAR='4.5'

这个sed表达式与我想要的完全相反。

echo $FOO | sed 's/^[0-9]\+.[0-9]//g'
.3

我怎么能反转这个sed表达式?

4 个答案:

答案 0 :(得分:3)

$  echo $BAR | sed -r 's/([0-9]+\.[0-9]+).*/\1/'
4.5

$ echo $FOO | sed -r 's/([0-9]+\.[0-9]+).*/\1/'
1.2
  • ([0-9]+\.[0-9]+)与前两部分匹配,例如1.2。保存在捕获组1中,\1

  • .*与其他

  • 相匹配

答案 1 :(得分:1)

如果您想尝试除regex

以外的其他人,请使用不含sed的解决方案
echo $BAR | awk -F. '{print $1 FS $2}'
4.5

答案 2 :(得分:1)

使用bash内置命令:

BAR='4.5.6.7x'
IFS="." set -- $BAR
echo $1.$2

输出:

4.5

答案 3 :(得分:1)

您可以使用Shell Parameter ExpansionArrays创建这样的函数来获取它:

f() {
    numbers=( ${1//./ } )
    echo ${numbers[0]}.${numbers[1]}
}

或没有数组:

f() {
    TMP=${1#*.}
    echo ${1%%.*}.${TMP%%.*}
}

实施例

$ FOO='1.2.3'
$ BAR='4.5.6.7x'
$ f $FOO
1.2
$ f $BAR
4.5