我正在阅读文件,我正在做类似的事情:
cat file | sed s/\ //g |awk '$0 !~ /[^0-9]/'
有了这条线,我想清理任何与数字不同的东西。
但我有一个问题,当文件没有排序时,命令工作正常,但是如果命令不起作用的排序文件,则输出为空。
谁能帮帮我?
使用grep -o'[0-9] +'不起作用,因为:
我有一个类似的文件:
311435ll3e
kk13322;.
erre433
输出结果为:
311435
3
13322
433
3是在第二行,我需要的输出是:
3114353
13322
433
答案 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] < file
或tr -cd '[0-9]' < file
不正确;它将无法取消]
和[
个字符,因为tr
会将它们视为SET1的一部分。