regex 将制表符后的数字作为一行进行匹配

ql3eal8s  于 2023-04-07  发布在  其他
关注(0)|答案(3)|浏览(117)

我想知道如何提取ID(KC 000001 -3)后的所有数字,包括使用Perl正则表达式的自来水后设置的数字。
第一个ID的附加数字(0.50)、第二个ID的附加数字(0.60)和第三个ID的附加数字(0.70 0.80)始终以空格作为新行开始,并以另一次点击结束。
输入文件。

KC000001    0.30    0.40    0.50
KC000002    0.30    0.40    0.50    0.60
KC152363    0.30    0.40    0.50    0.60    0.70    0.80

我想得到这个输出文件。

0.30    0.40    0.50
0.30    0.40    0.50    0.60
0.30    0.40    0.50    0.60    0.70    0.80

我准备了这个正则表达式。

if ($linea =~ /^(.[a-z0-9]\d+.\d)\s(.?)$/){
    print $line 
}

然而,它给了我以下错误(它没有打印制表符后的数字(第一个0. 50),(第二个0. 60),和(第三个0. 70 0. 80))

0.30    0.40
0.30    0.40    0.50
0.30    0.40    0.50    0.60

我想知道这个正则表达式有什么问题。有没有可能只用一个正则表达式来创建它?
输入文件。

KC000001    0.30    0.40    0.50
KC000002    0.30    0.40    0.50    0.60
KC152363    0.30    0.40    0.50    0.60    0.70    0.80

输出文件

0.30    0.40
0.30    0.40    0.50
0.30    0.40    0.50    0.60
gwo2fgha

gwo2fgha1#

使用Perl一行程序:

$ perl -F"\t" -nE 'say join "\t", @F[1..$#F]' file | tee output_file
0.30    0.40    0.50
0.30    0.40    0.50    0.60
0.30    0.40    0.50    0.60    0.70    0.80

这是一个 array slice 操作,只保留 column-2-till-the-end

y1aodyip

y1aodyip2#

这将删除每行的第一个选项卡之前的所有内容(包括第一个选项卡):

$line =~ s/^[^\t]*\t//;
print $line;

作为一行程序:

perl -pe's/^[^\t]*\t//'

参见Specifying file to process to Perl one-liner

mnemlml8

mnemlml83#

使用这个Perl一行程序:

perl -pe 's{^KC\w+\t}{}' infile > outfile

或就地更改文件:

perl -i.bak -pe 's{^KC\w+\t}{}' infile

Perl一行程序使用以下命令行标志:
-e:告诉Perl在行内查找代码,而不是在文件中。
-p:一次循环一行输入,默认情况下将其分配给$_。每次循环迭代后添加print $_
-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在其名称后面附加扩展名.bak来保存原始文件的备份副本。如果您想跳过写入备份文件,只需使用-i并跳过扩展名。

参见:

相关问题