清理文件中的字母和字符,只使用bash留下数字

时间:2013-12-13 19:48:07

标签: linux bash ssh sh

我正在阅读文件,我正在做类似的事情:

  cat file  | sed s/\ //g |awk '$0 !~ /[^0-9]/'

有了这条线,我想清理任何与数字不同的东西。

但我有一个问题,当文件没有排序时,命令工作正常,但是如果命令不起作用的排序文件,则输出为空。

谁能帮帮我?

使用grep -o'[0-9] +'不起作用,因为:

我有一个类似的文件:

311435ll3e
kk13322;.

erre433

输出结果为:

311435
3
13322
433

3是在第二行,我需要的输出是:

3114353
13322
433

1 个答案:

答案 0 :(得分:3)

作为一般规则,没有理由让awk和sed同时出现在同一个管道中,因为能力有很大的重叠,而且awk / grep / sed组合经常也是如此。

如果您只想抑制字符行中的非数字字符,请使用(例如)sed -e 's/[^0-9]//g' file,或者如果您想在没有备份的情况下执行此操作,sed -i -e 's/[^0-9]//g' file或将备份放置到.bak文件sed -ibak -e 's/[^0-9]//g' file

要抑制空白行,您可以在sed之后附加|egrep -v '^$',但只使用sed的d命令删除模式空间并在模式空间为空时开始下一个循环更有效。例如,
sed -e 's/[^0-9]//g; /^$/d' file
如果替换后该行为空,则执行d

1_CR评论中建议的表格,
sed -e 's/[^0-9]//g' -e '/./!d'
是另一种选择。该表单测试行中是否至少包含一个字符,如果是,执行d

如果要取消文件中不是数字的所有内容,请使用tr -cd 0-9 < file。这也抑制了换行。

注意,表单tr -cd [0-9] < filetr -cd '[0-9]' < file不正确;它将无法取消][个字符,因为tr会将它们视为SET1的一部分。