3

我经历了几个 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/ 我正在尝试从多个文件中获取数据并放入一个文件中以供以后绘制。

4

3 回答 3

7

您的命令格式为:

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

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

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

grep '^!' input | grep -Eoe '-?[0-9.]+' >> output 
于 2013-04-23T10:30:34.963 回答
0
perl -lne 'm/.*?([\d\.\-]+).*/g;print $1' your_file >>anotherfile_to_append
于 2013-04-23T10:37:33.707 回答
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' /模式的开始,^而不是(如乘以假),以和删除[^!]开头的任何行。第二个表达式,不匹配 0 到 9 之间的任何内容,并且 . 和-,(其他所有内容)替换为空(即删除)并完成:)!d[^0-9.-]//

于 2013-04-23T10:42:09.183 回答