Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Regex 使用awk仅从字符串中获取数字_Regex_Awk - Fatal编程技术网

Regex 使用awk仅从字符串中获取数字

Regex 使用awk仅从字符串中获取数字,regex,awk,Regex,Awk,背景: 我有一个专栏,应该以“描述文本ref12345678”的形式获得用户输入。我有获取参考号的现有脚本,但不幸的是,一些用户添加了错误的参考号,因此它可以是“ref 12345678”,“RF12345678”,“abcd12345678”或任何变体。当然,错误的格式会破坏一些触发的脚本。 目前,我无法控制用户对该字段的输入,因此我希望稍后在管道中生成脚本以获取数字 现在我正在用awk'{gsub(/[:alpha:]]/,“”)剥离字母;1',但替代似乎是一种低效的解决方案。(我知道我也可

背景:
我有一个专栏,应该以“描述文本ref12345678”的形式获得用户输入。我有获取参考号的现有脚本,但不幸的是,一些用户添加了错误的参考号,因此它可以是
“ref 12345678”
“RF12345678”
“abcd12345678”
或任何变体。当然,错误的格式会破坏一些触发的脚本。 目前,我无法控制用户对该字段的输入,因此我希望稍后在管道中生成脚本以获取数字

现在我正在用
awk'{gsub(/[:alpha:]]/,“”)剥离字母;1'
,但替代似乎是一种低效的解决方案。(我知道我也可以用
sed-n's/*[a-zA-Z]//p'
tr-d'[:alpha:]'
来实现这一点,但它们本质上是一样的,我希望awk具有额外的可编程性)

问题是,有没有办法将awk设置为只打印字符串中的数字,或者将定界设置为字符串中的数字项?(或者替代真的是这个问题最有效的解决方案)


总之:如何使用awk for
$echo“ref12345678”
只打印“12345678”而不进行替换?

如果awk是必须:

grep -o '[0-9]\+'
例如:

kent$ echo "ref12345678"|grep -o '[0-9]\+'
12345678
awk为例:

kent$ echo "ref12345678"|awk -F'[^0-9]*' '$0=$2'     
12345678
echo "19 trees"|awk '{print ($0+0)}'
另一个选项(假设GNU awk)涉及指定非数值正则表达式作为分隔符

awk -F '[^0-9]+' '{OFS=" "; for(i=1; i<=NF; ++i) if ($i != "") print($i)}'

awk-F'[^0-9]+'{OFS=“”;对于(i=1;i您也可以使用awk尝试以下操作,假设字符串中只有一个数字:

awk '{print ($0+0)}'
这会将整个字符串转换为数字,而awk的实现方式只剩下符合数字描述的值。例如:

kent$ echo "ref12345678"|awk -F'[^0-9]*' '$0=$2'     
12345678
echo "19 trees"|awk '{print ($0+0)}'
将产生:

19

在AWK中,您可以指定多个条件,如:



将只显示没有任何字母和标点符号的数字。 with!~表示不包含任何

grep可以完美地工作:

$ echo "../Tin=300_maxl=9_rdx=1.1" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?'
300
9
1.1
逐步解释:

-E
使用扩展正则表达式

-o
只返回匹配项,不返回上下文

[+-]?[0-9]+([.][0-9]+)?+
匹配识别为以下各项的编号:

[+-]?
可选的前导符号

[0-9]+
一个或多个数字

([.][0-9]+)?
后跟一个或多个数字的可选句点

将输出放在一个数组中很方便

arr=($(echo "../Tin=300_maxl=9_rdx=1.1" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?'))
然后像这样使用它

Tin=${arr[0]}
maxl=${arr[1]}
etc..

谢谢,提供的awk示例并没有完全做到这一点,但让我找到了正确的路径:
$echo“ref12345678”| awk-F'[^0-9]*'{print$2}'
对OSX附带的awk进行了操作。尽管只有当数字在前面时才有效