在每个正则表达式匹配之间插入新行?

时间:2012-06-26 22:02:58

标签: regex perl

我有这样的文字:

characters      value ∆delta     

ABCDEABCDE      -3.663  [analyze]
EFGHEFGHEF      -1.937  [analyze]
IJKLIJKLIJ      2.137   [analyze]

我想提取数值

我用google搜索了regexp并想出了这个perl单行

perl -p -i -e 's/[^0-9-.]//g' file.txt

这对你来说一定非常糟糕,但在这种情况下它似乎对我有用。 唯一的问题是,文本文件现在看起来像

-3.663-1.9372.137

但我希望它看起来像

-3.663
-1.937
2.137

如何在此正则表达式中的每个匹配项之间插入新行?

谢谢!

6 个答案:

答案 0 :(得分:1)

您需要将换行添加到角色类

perl -p -i -e 's/[^0-9-.\n]//g' file.txt

这不会“添加”换行符,而是保留现有换行符。还有其他方法可以基于列而不是正则表达式实现此目的。

AWK:

awk '{print $2}' file.txt > tmpfile.txt && mv tmpfile.txt file.txt

的bash / SH:

while read -r _ data _; do
   echo "$data"
done < file.txt > tmpfile.txt
mv tmpfile.txt file.txt

答案 1 :(得分:1)

你应该没事:

perl -p -i -e 's/[^-\d.\n\r]+//g' file.txt

您也可以尝试:

perl -p -i -e 's/[^-\d.]*(\-?[\d\.]+)[^-\d.]*/$1\n/g' file.txt 

或者如果您的文字可能包含.-而没有数字(例如ABC-DEF.GHI -3.663 [analyze]),那么:

perl -p -i -e 's/(?:[^-\d.]+|\-(?!\d)|\.(?!\d))*(\-?(?:\d?\.?\d+|\d+\.?\d*))(?:[^-\d.]+|\-(?!\d)|\.(?!\d))*/$1\n/g' file.txt 

答案 2 :(得分:1)

你有以制表符分隔的数据,所以让我们利用它来获得最佳结果。

perl -i -F\\t -lanE'BEGIN { <>; <>; } say $F[2]' file.txt

如果您的数据只是空格分隔,我建议

perl -i -lanE'BEGIN { <>; <>; } say $F[2]' file.txt

答案 3 :(得分:0)

您的解决方案将如何运作? - 我只将-pe更改为-lpe

 perl -i -lpe 's/[^0-9.-]//g' file.txt

这可以缩短为:

 perl -i -lpe's/[^--9]//g' file.txt

此致

RBO

答案 4 :(得分:0)

问题的“简单”解决方案是使用-l选项,它将为您处理行结尾。在您的情况下,它会使用-p选项为您的打印添加换行符。

perl -pi -le 's/[^0-9-.]//g' file.txt

但是,此解决方案具有破坏性,因为输入文件已被破坏,并且它假定文件中不存在其他数字,短划线和句点。后者很容易破坏您的数据。

在我看来,ikegami在标签或空格上拆分的解决方案是最好的。但是,您也可以使用正则表达式提取完整的数字:

perl -nlwe 'print /(-?[\d.]+)/' file.txt

这将提取包含数字和句点的第一个字符串,并带有可选的前导短划线。如果要将输出保存到文件,只需重定向

即可
perl -nlwe 'print /(-?[\d.]+)/' file.txt > output.txt

答案 5 :(得分:0)

感谢所有回复。脚本在数字之间插入一个新行,但没有删除文档中的空行(例如,我的第一个示例文本文件中的一行空行)。至少这是我的测试文本文件的结果。我用谷歌搜索了如何删除空行,虽然我无法将它组合起来,但我现在可以使用两个单行来获得我想要的东西

perl -i -lpe's/[^--9]//g' file .txt
perl -pi -e "s/^\n//" file .txt