2013-04-23 108 views
3

我经历了几个grep示例,但没有看到如何执行以下操作。从行中grep一个数字并将其附加到文件

说,我有一个文件用一条线

! some test here and number -123.2345 text 

我可以用

grep ! input.txt 

获得这一行,但我如何得到来自该行的数字(可能为正或负)和将它追加到另一个文件的末尾?是否可以将grep应用于grep结果? 如果是的话,那么我可以通过什么获得的数量一样

grep -Eo "[0-9]{1,}|\-[0-9]{1,}" 

P/S /我使用的OS-X

P/P/S /我想要来从多个文件数据并放入一个单一的文件以供日后绘图。

回答

7

与命令格式是:从grep

grep ! input.txt | grep -Eo "[0-9]{1,}|\-[0-9]{1,}" >> output 

grep,我们使用管道运营商|这让我们链命令组合在一起。要将此输出附加到文件,我们使用重定向运算符>>

但是有几个问题。您正则表达式写得更好:grep -Eoe '-?[0-9.]+'这允许小数点,并返回单个数字而不是两个,如果您想要以!开头的行,那么grep ^!最好避免与包含!但不以它开头的行匹配。更好地做到:

grep '^!' input | grep -Eoe '-?[0-9.]+' >> output 
+1

您打算在示例中允许小数点吗? '123.234'怎么样? – 2013-04-23 10:34:27

+0

感谢您的回答,几乎可行。但是在os-x上“ - ?”似乎不被允许。当我使用“[0-9] {1,} | \ - [0-9] {1,}”我有两个数字 - 在“。”之前和之后。 – Denis 2013-04-23 10:37:25

+0

@Denis是的,如果忘记了,如果模式以'-'开始,会导致问题。修正是使用'-e'。请参阅编辑。 – 2013-04-23 10:38:06

0
perl -lne 'm/.*?([\d\.\-]+).*/g;print $1' your_file >>anotherfile_to_append 
0
$foo="! some test here and number -123.2345 text" 
$echo $foo | sed -e 's/[^0-9\.-]//g' 
$-123.2345 

编辑: -

一个文件,

[ ]$ cat log 
! some test here and number -123.2345 text 
some blankline 
some line without "the character" and with number 345.566 
! again a number 34 
[ ]$ sed -e '/^[^!]/d' -e 's/[^0-9.-]//g' log > op 
[ ]$ cat op 
-123.2345 
34 

现在让我们看看牙签:) '/^[^!]/d'/开始图形,^不(如乘以假),[^!] anyline开头!d删除。第二个表达式,[^0-9.-]不匹配0到9之间的任何内容,以及。和 - ,(其他所有)//替换为空(即删除)并完成:)

+0

你不需要在字符类中转义'.',除非你在问题的上下文中显示它是如何使用的,否则这不会有太大的帮助。 – 2013-04-23 10:44:15

相关问题