鉴于test.txt
的内容如下:
Hello 10 love 20 haha 30
Hello Hello 11 love love 21 haha 31
41 Hello Hello 42 love love 43 haha 44
我想要某种grep
表达式,以便在说:
$ cat test.txt | grep ???
我得到了这个输出:
20
21
42
如何实现此功能?
答案 0 :(得分:3)
好像你正试图获得第二个号码..
grep -oP '^\D*\d+\D*\K\d+' file
或
使用sed。
sed 's/^[^[:digit:]]*[[:digit:]]\+[^[:digit:]]*\([[:digit:]]\+\).*/\1/' file
答案 1 :(得分:1)
您可能想要考虑的替代方法,使用awk:
awk -F'[^[:digit:]]+' '{ print /^[[:digit:]]/ ? $2 : $3 }' file
这会将字段分隔符设置为一个或多个非数字字符,这意味着您感兴趣的字段是第二个或第三个字段,具体取决于该行是否以数字开头。
为简洁起见,您可能更愿意使用范围[0-9]
而不是[[:digit:]]
:
awk -F'[^0-9]+' '{ print /^[0-9]/ ? $2 : $3 }' file
或者您可以使用perl捕获您感兴趣的行的部分:
perl -lne 'print $1 if /\d\D+(\d+)/' file
\d
匹配数字,\D
匹配非数字,因此这将捕获该行上找到的第二组数字。如果未找到第二组数字,则不会打印任何内容(这与awk脚本的行为不同)。