繁体   English   中英

从bash shell中的文本行读取数字

[英]Reading numbers from a text line in bash shell

我正在尝试编写一个bash shell脚本,该脚本将打开某个文件CATALOG.dat ,其中包含以下由字符和数字组成的行:

event_0133_pk.gz
event_0291_pk.gz
event_0298_pk.gz
event_0356_pk.gz
event_0501_pk.gz

我想做的是使用> ./NUMBERS.dat类的东西在新文件NUMBERS.dat打印数字(仅数字),以获取:

0133
0291
0298
0356
0501

我的问题是:如何从文本行中提取数字? 是否可以使脚本将数字作为变量读取,例如C / C ++中的event_0%d_pk.gz

一个grep解决方案:

grep -oP '[0-9]+' CATALOG.dat >NUMBERS.dat

sed解决方案:

sed 's/[^0-9]//g' CATALOG.dat >NUMBERS.dat

awk解决方案:

awk -F"[^0-9]+" '{print $2}' CATALOG.dat >NUMBERS.dat

有很多方法可以实现您的结果。 一种方法是使用awk:

awk -F_ '{print $2}' CATALOG.dat > NUMBERS.dat

这会将字段分隔符设置为下划线,然后打印包含数字的第二个字段。

Awk

awk 'gsub(/[^[:digit:]]/,"")' infile 

重击

while read line; do echo ${line//[!0-9]}; done < infile

TR

tr -cd '[[:digit:]\n]' <infile

您可以使用grep命令提取数字部分。

grep -oP '(?<=_)\d+(?=_)' CATALOG.dat

输出为

0133
0291
0298
0356
0501

要么

很简单

grep -oP '\d+' CATALOG.dat

为此,您不需要在grep中使用perl模式。 BRE可以做到这一点。

grep -o '[[:digit:]]\+' CATALOG.dat > NUMBERS.dat

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM