我获得了包含数据(字母数字、任何顺序和布局的特殊字符)的文本文件。现在我必须一一打印所有数字数据。
例子 :
this is txt *24354 filer3243gdt 4332 123
sfdg gtdf, gtdf;tr 3435; gfdsf .43er, ;43 3543;
4354w t535 tfgq 3542 fgdg, 243; wre; 24342 ; 24354 ;;;; 13
tgd dsgf ,[email protected]
输出
4332
123
3435
43
3543
3542
243
24342
24354
13
PS:问题是这些数字没有特定的开始或结束,所以我无法想到正则表达式可以做到这一点。
那些角色空间,逗号,分号,点, 和新队可以用来分隔数字。
答案1
使用标准tr
和grep
:
tr -s ',;. ' '[\n*]' <file | grep -x '[[:digit:]]*'
这首先将所有可能的分隔字符更改为换行符(并将多个连续的换行符“压缩”为一个)。第一步产生输出
this
is
txt
*24354
filer3243gdt
4332
123
sfdg
gtdf
gtdf
tr
3435
gfdsf
43er
43
3543
4354w
t535
tfgq
3542
fgdg
243
wre
24342
24354
13
tgd
dsgf
3256653756456744rfdgf@gmail
com
由此,grep
用于提取仅包含数字的行。强制全行匹配的-x
选项,并且使用的模式匹配任意数量的数字。grep
该grep
步骤的结果是
4332
123
3435
43
3543
3542
243
24342
24354
13
这与您的预期输出相同。
我的第一次尝试看起来像
tr -s '[:punct:][:blank:]' '[\n*]' | grep -x '[[:digit:]]*'
它使用任何标点符号或空白字符作为分隔符。结果也得到了第一个24354
(在输入中前面有一个*
)。这可能是错误的,但是代码看起来更好:-)
字符[:punct:]
类包含集合
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
是[:blank:]
空格和制表符。
答案2
这里需要 PCRE 环视:
grep -oP '(?<=^|\s|;)\d+(?=$|\s|;)' file
我认为,可以将缺少的有效分隔符添加到正则表达式中明显的位置。
答案3
$ perl -F'[\s,;.]' -lane 'foreach (@F) {print $_ if m/^\d+$/}' inputfile
4332
123
3435
43
3543
3542
243
24342
24354
13
这将使用空格和您指定为字段分隔符的字符将每个输入行拆分为字段。
然后,对于每个字段,脚本检查该字段是否仅包含数字,如果包含则打印它。