[英]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.