【发布时间】:2019-03-05 10:41:36
【问题描述】:
我得到了一个看起来像这样的字符串SOMETHING00000076XYZ
如何使用 shell 脚本 从字符串中提取数字 76? 注意76前面是零,后面是字母。
【问题讨论】:
我得到了一个看起来像这样的字符串SOMETHING00000076XYZ
如何使用 shell 脚本 从字符串中提取数字 76? 注意76前面是零,后面是字母。
【问题讨论】:
第一个解决方案:如果您对 awk 没问题,请尝试关注。
echo "SOMETHING00000076XYZ" | awk 'match($0,/0+[0-9]+/){val=substr($0,RSTART,RLENGTH);sub(/0+/,"",val);print val;val=""}'
如果您想将其保存到变量中,请使用以下内容。
variable="$(echo "SOMETHING00000076XYZ" | awk '{sub(/.*[^1-9]0+/,"");sub(/[a-zA-Z]+/,"")} 1')"
第二个解决方案:在此处再添加 1 个awk 解决方案(记住您的示例)。
echo "SOMETHING00000076XYZ" | awk '{sub(/.*[^1-9]0+/,"");sub(/[a-zA-Z]+/,"")} 1'
【讨论】:
这是一个sed 选项:
echo "SOMETHING00000076XYZ" | sed -r 's/[^0-9]*0*([0-9]+).*/\1/g';
76
这里是使用的正则表达式模式的解释:
[^0-9]* match zero or more non digits
0* match zero or more 0's
([0-9]+) match AND capture any quantity of non zero digits
.* match the remainder of the string
然后,我们只需替换为\1,这是第一个(也是唯一一个)捕获组。
【讨论】:
echo 'SOMETHING00000076XYZ' | grep -o '[1-9][0-9]*'
【讨论】:
使用gnu grep:
grep -oP '0+\K\d+' <<< 'SOMETHING00000076XYZ'
76
\K 重置所有匹配的信息。
这是awk的另一个变体:
awk -F '0+' 'match($2, /^[0-9]+/){print substr($2, 1, RLENGTH)}' <<< 'SOMETHING00000076XYZ'
76
【讨论】:
你也可以试试 Perl
$ echo "SOMETHING00000076XYZ" | perl -ne ' /\D+0+(\d+)/ and print $1 '
76
$ a=$(echo "SOMETHING00000076XYZ" | perl -ne ' /\D+0+(\d+)/ and print $1 ')
$ echo $a
76
$
【讨论】:
$ echo 'SOMETHING00000076XYZ' | awk '{sub(/^[^0-9]+/,""); print $0+0}'
76
【讨论】:
你可以使用sed作为
echo "SOMETHING00000076XYZ" | sed "s/[a-zA-Z]//g" | sed "s/^0*//"
【讨论】:
| sed "s/^0*//"。