我正试图从一个制表符分隔的文件中提取一个需要存储在变量中的数字。我正在用正则表达式来解决这个问题,这要归功于我在网上进行的一些研究。
文件组成如下:
0 0 2500 5000
1 5000 7500 10000
2 10000 12500 15000
3 15000 17500 20000
4 20000 22500 25000
5 25000 27500 30000
我需要提取第二列中的数字,给定第一列的数字。我在网上编写并测试了regex:
(?<=5t).*?(?=t)
我需要第六线的25000。
我开始使用sed,但正如您所知,即使使用-E
选项来启用正则表达式的扩展版本,它也不喜欢lookbacking和lookahead模式。我也尝试过awk和grep,但由于类似的原因失败了。
更进一步,我发现perl可能是正确的命令,但我无法使其正常工作。我正在尝试命令
perl -pe '/(?<=5t).*?(?=t)/' | INFO.out
但我承认我的知识很差,我有点迷路了。
下一步将是读取";5〃;在正则表达式中,如果您已经知道可能出现的问题,请告诉我。
不需要lookbehinds——在空间上拆分每一行,并检查第一个字段是否为5
。
在Perl中,有一个方便的命令行选项-a
,使用它可以为我们拆分每一行,并获得带有字段的@F
数组
perl -lanE'say $F[1] if $F[0] == 5' data.txt
请注意,这是对5
数字(==
(的测试
grep
支持用于perl正则表达式的-P
,而仅支持用于匹配的-o
,因此这与一个lookbacking一起工作:
grep -Po '(?<=5t)d+' file
这可以很容易地使用shell变量:
VAR=5 && grep -Po "(?<=$VARt)d+"
或perl -n
,显示使用s///e
匹配并打印捕获组:
perl -lne 's/^5t(d+)/print $1/e' file
为什么需要使用正则表达式?如果您所做的只是查找以5开头的行并获得第二列,则可以使用sed
和cut
,例如:
<infile sed -n '/^5t/p' | cut -f2
输出:
25000
一个选项是使用sed,在字符串的开头和选项卡捕获组中的数字后匹配5
sed -En 's/^5t([[:digit:]]+)t.*/1/p' file > INFO.out
INFO.out文件包含:
25000
使用sed
$ var1=$(sed -n 's/^5[^0-9]*([^ ]*).*/1/p' input_file)
$ echo "$var1"
25000