我的文件格式如下:
EDouble entry for scenario XX AAA 70337262003 Line 000000003350
EDouble entry for scenario XX AAA 70337262003 Line 000000003347
EDouble entry for scenario XX AAA 71375201001 Line 000000003353
EDouble entry for scenario XX AAA 71375201001 Line 000000003351
EDouble entry (different date/time) for scenario YY AAA 10722963407 Line 000000000447
EDouble entry for scenario YY AAA 55173006602 Line 000000002868
EDouble entry (different date/time) for scenario YY AAA 60404822801 Line 000000003285
我想要做的是基本上剥离所有字母字符并输出包含以下内容的文件:
70337262003
70337262003
71375201001
71375201001
10722963407
55173006602
60404822801
我已经想到了几种可以帮助我实现这一目标的方法,只是列出了一些想法,因为我没有现成的解决方案。我可以用以下内容删除所有字母字符:
tr -d '[[:alpha:]]'
但这仍然意味着我需要进一步处理文件以将第一个数字与第二个数字分开。 Sed可能提供更简单的解决方案,因为第二个数字总是以0开头。
sed -n 's/.*\[1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1- 9]\).*/\1/p'
找到模式,只打印模式 - 但上面的命令不输出任何内容。有人可以帮帮我吗?没有必要用sed完成这个,我想用gsub
和grep有类似的东西吗?
答案 0 :(得分:2)
打印第三栏到最后一栏:
awk '{print $(NF-2)}' file
输出:
70337262003 70337262003 71375201001 71375201001 10722963407 55173006602 60404822801
答案 1 :(得分:2)
所以如果您更喜欢sed,请使用:
sed -rn "s@.*([1-9][0-9]{10}).*@\1@p" file.txt
答案 2 :(得分:1)
使用grep
,您可以执行此操作:
grep -o '[1-9][0-9]\{10\}' file
使用sed:
sed -n 's/.*\([1-9][0-9]\{10\}\).*/\1/p' file
针对11位数的误差幅度很小,因为从0开始的数字长度为12位。考虑到这一事实,一个更强大的解决方案是:
sed -n 's/.*[[:blank:]]\([1-9][0-9]\{10\}\).*/\1/p' file
即确保在号码前匹配[[:blank:]]
。
答案 3 :(得分:1)
我看到AAA
在数字后面的所有行中都是常量。
因此你可以使用它:
$ grep -oP '(?<=AAA\s)\s*\d+' data
70337262003
70337262003
71375201001
71375201001
10722963407
55173006602
60404822801
答案 4 :(得分:1)
这个数字提取一组数字后跟一个单词边界,但后面跟不是行的结尾:
$ grep -Po '\d+\b(?!$)' infile
70337262003
70337262003
71375201001
71375201001
10722963407
55173006602
60404822801
-P
启用Perl正则表达式-o
仅保留匹配\d+\b
贪婪地匹配数字后跟字边界(?!$)
是&#34;否定前瞻&#34;:如果下一个字符是该行的结尾,则不匹配