删除所有不是数字的文本行

use*_*499 5 grep text-processing

我有一个单词表,我想将其中仅包含数字的每一行文本提取到一个新文件中。我该怎么办?

Kus*_*nda 8

提取仅包含数字的行:

$ grep -x '[0-9][0-9]*' words >digits
Run Code Online (Sandbox Code Playgroud)

正则表达式[0-9][0-9]*将匹配任何包含至少一位数字的行,并且-x选项grep要求整行匹配给定的表达式。

如果您的文件没有空行,您可以将其更改为grep -x '[0-9]*'.

如果您想要带有numbers 的行,请删除带有字母字符的行(比尝试为通用数字构建正则表达式更容易):

$ grep -v '[a-zA-Z]' words >numbers
Run Code Online (Sandbox Code Playgroud)

使用 POSIX 字符类的两种变体:

$ grep -x '[[:digit:]][[:digit:]]*' words >digits
$ grep -v '[[:alpha:]]' words >numbers
Run Code Online (Sandbox Code Playgroud)

更新:如果要选择包含浮点数的行,可以使用(扩展)正则表达式^[+-]?([0-9]*\.)?[0-9]+$

$ grep -x -E '[+-]?([0-9]*\.)?[0-9]+' words >floats
Run Code Online (Sandbox Code Playgroud)

这一切都归结为我们正在寻找什么样的“数字”。

  • 可以使用`^[0-9]\+$`代替`^[0-9][0-9]*$` (2认同)
  • @spasic 是的,它在大型数据集上会更有效。我一直只使用 `*`,因为当在 BRE 和 ERE 之间切换时它不需要以任何方式改变。 (2认同)

Par*_*met 4

删除任何包含字母 by 的行sed,然后将输出放入另一个文件:

sed '/[a-z]/Id' yourInputFile > yourOutputFile
Run Code Online (Sandbox Code Playgroud)

或者如果您想就地更改原始文件:

sed -i '/[a-z]/Id' yourInputFile 
Run Code Online (Sandbox Code Playgroud)