有什么方法可以捕获文件中每行中第一次出现的数字。
例如,我有一个名为 的文件test
,内容类似于
AA111 1 DFJKD BKJ3 () A G C TT
BB112 DKFJ 32 JDKFJ JE () DF
113 BDNF 33 3()
期望的输出是
111
112
113
输入中的每一行均以字母数字字符开头(即字母或数字;无特殊字符)
答案1
以下是一些方法:
sed 's/^[^0-9]*\([0-9]\+\).*/\1/' test
cat test | tr -c '0-9\n' ' ' | while read first rest; do echo $first; done
gawk -F '[^0-9]+' '{print $2}' test # requires non-digits to start line
perl -nE'say/(\d+)/?$1:""' test # code golf
重击:
while read line; do [[ $line =~ [[:digit:]]+ ]] && echo ${BASH_REMATCH[0]} || echo; done
答案2
这是在 sed 中执行此操作的一种方法:
sed -n 's/^[^[:digit:]]*\([[:digit:]]*\).*/\1/; /[[:digit:]]/p' test > test.out
这:
- 去掉任何潜在的前导非数字,
- 捕获并
\1
用数字替换 ( ) 数字和(任何其他内容) - 如果该行包含任何数字,则打印它(否则,默认
-n
不打印行)
(向 glenn 致敬,鼓励对我原来的 sed 语句进行一些压缩)
答案3
并使用 grep:
grep -oP '^\D*\K\d+' File