sed
和awk
专家的问题。
如果我有这样的字符串: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
答案 0 :(得分:3)
您可以使用sed
:
VALID_NUMBER="$(sed 's/^[A-Z0]*\([0-9]*\).*/\1/' <<< "$STR")"
^[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"