如何使regex与perl命令一起工作并从文件中提取数字



我正试图从一个制表符分隔的文件中提取一个需要存储在变量中的数字。我正在用正则表达式来解决这个问题,这要归功于我在网上进行的一些研究。

文件组成如下:

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模式。我也尝试过awkgrep,但由于类似的原因失败了。

更进一步,我发现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开头的行并获得第二列,则可以使用sedcut,例如:

<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

最新更新