我有这样的文字:
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
如何在此正则表达式中的每个匹配项之间插入新行?
谢谢!
答案 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