我正在尝试编写一个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
?
答案 0 :(得分:3)
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
答案 1 :(得分:2)
有很多方法可以达到你的结果。一种方法是使用awk:
awk -F_ '{print $2}' CATALOG.dat > NUMBERS.dat
这会将字段分隔符设置为下划线,然后打印包含数字的第二个字段。
答案 2 :(得分:1)
<强> awk中强>
awk 'gsub(/[^[:digit:]]/,"")' infile
<强>击强>
while read line; do echo ${line//[!0-9]}; done < infile
<强> TR 强>
tr -cd '[[:digit:]\n]' <infile
答案 3 :(得分:0)
您可以使用grep
命令提取数字部分。
grep -oP '(?<=_)\d+(?=_)' CATALOG.dat
将输出显示为
0133
0291
0298
0356
0501
或者
很简单grep -oP '\d+' CATALOG.dat
答案 4 :(得分:0)
你不需要在grep中使用perl模式。 BRE可以做到这一点。
grep -o '[[:digit:]]\+' CATALOG.dat > NUMBERS.dat