如何从字符串中提取有效数字(即使其后跟零)

时间:2019-03-06 13:14:43

标签: shell awk sed

sedawk专家的问题。

如果我有这样的字符串:ABCDEF00012300XYZ。 我想提取字母和零后面的数字。因此,我想从字符串中提取12300

从精神上讲,我只想提取字符串中的有效数字。 00012300在数学意义上表示12300

我尝试了以下

STR=ABCDEF00012300XYZ
VALID_NUMBER="$(echo $STR | awk '{sub(/.*0+/,"");sub(/[a-zA-Z]+/,"")} 1')"

如果我通过ABCDEF000123XYZ,并且从123中提取STR,上述方法就会起作用。但是如果123后跟零,则失败,在这种情况下,应该得到12300

请注意,这是我正在使用的Linux上的sed

5 个答案:

答案 0 :(得分:3)

您可以使用sed

VALID_NUMBER="$(sed 's/^[A-Z0]*\([0-9]*\).*/\1/' <<< "$STR")"

查看online sed demo

^[A-Z0]*\([0-9]*\).*模式将匹配:

  • ^-一行的开头
  • [A-Z0]*-任何大写字母或零,0个或多个重复
  • \([0-9]*\)-这将在组1中捕获0个或多个数字
  • .*-这将与其余行匹配。

然后,替换模式中的\1仅将您需要的数字保留在输出中。

答案 1 :(得分:2)

另一个awk:

$ awk '
match($0,/[1-9][0-9]*/) {            # match first non-zero leading string of numbers
    print substr($0,RSTART,RLENGTH)  # and print it
}' <<< ABCDEF00012300XYZ             # or you could echo ... | awk ...
12300

或sed:

$ sed -E 's/(^[^1-9]*|[^0-9]+$)//g' <<< ABCDEF00012300XYZ
12300

该sed脚本从所有[^1-9]的开始到结尾[^0-9]的替换。

答案 2 :(得分:1)

您能否请尝试(经过GNU awk测试)。

echo "ABCDEF00012300XYZ" |
awk '
  match($0,/[a-zA-Z]+0+[0-9]+/){
    val=substr($0,RSTART,RLENGTH)
    gsub(/[a-zA-Z]+[^1-9]0+/,"",val)
    print val
   val=""
}'

说明: 添加上述代码的说明。

echo "ABCDEF00012300XYZ" |               ##Printing value by shell echo command here and sending its output as standard input for awk command.
awk '                                    ##Starting awk command here.
  match($0,/[a-zA-Z]+0+[0-9]+/){         ##Using match for matching regex for continous alphabets with continous zeros and then following digits in match OOTB function of awk.
    val=substr($0,RSTART,RLENGTH)        ##Creating variable val whose value is sub string of current line whose starting point is RSTART till value of RLENGTH.
    gsub(/[a-zA-Z]+[^1-9]0+/,"",val)     ##Using gsub to globally substituting alphabets then continous zeroes Leaving other digits(till other digit occurence comes) for val here.
    print val                            ##Printing val value here.
   val=""                                ##Nullifying variable val here.
}'                                       ##Closing BLOCK for awk program here.

答案 3 :(得分:1)

另一个GNU awk解决方案:

$ STR=ABCDEF00012300XYZ                                                          

$ awk -v str="$STR" 'BEGIN{print gensub(/[A-Za-z0]+([0-9]+).*/, "\\1", 1, str)}' 
12300    

但是,如果不只限于字母和零后的 ,则最好像这样:

awk -v str="$STR" 'BEGIN{print gensub(/[^1-9]*([0-9]+).*/, "\\1", 1, str)}' 

答案 4 :(得分:1)

使用参数扩展:

str="ABCDEF00012300XYZ"
inter="${str%${str#*[[:digit:]]}}"
str="${str#${inter%[[:digit:]]}}"
inter="${str%${str#*[![:digit:]]}}"
str="${str%${str#${inter%[![:digit:]]}}}"
inter="${str%${str#*[1-9]}}"
str="${str#${inter%[1-9]}}"
echo "valid_number = $str"