以下是一些其他变体:
下面的每个示例都使用此正则表达式:
(\d+\.\d*|\.\d+|\d+)
它匹配(在一个组中)
ddd.
ddd.ddd
.ddd
ddd
。如果您的小数不同,例如不想捕获
.ddd
(仅小数)变体,请从正则表达式中删除它。
一个文件/字符串的用法
#using `paste`
echo "bench-100-net-buffering1000.out:Throughput: 3212.97" | grep -Eo '(\d+\.\d*|\.\d+|\d+)' | paste -s -
# using echo for making the "one line"
echo $(grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97")
#HERESTRING and different separator
grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97" | paste -sd, -
#process substitution.. ;)
paste -sd ' ' <(grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97")
对于多个文件,使用bash
循环与上面相同。在使用ff*
作为文件名的示例中。
#Using null-term find
while IFS= read -r -d '' file; do
grep -Eo '(\d+\.\d*|\.\d+|\d+)' "$file" | paste -s -
done < <(find . -maxdepth 1 -type f -name ff\* -print0)
# or alternative - also prints filenames
while IFS= read -r -d '' file; do
echo "$file:" $(grep -Eo '(\d+\.\d*|\.\d+|\d+)' $file)
done < <(find . -maxdepth 1 -type f -name ff\* -print0)
echo Using FOR loop
for file in ff* ; do
grep -Eo '(\d+\.\d*|\.\d+|\d+)' "$file" | paste -s -
done
Perl 变体:
perl -0777 -nE 'say "@{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*
也打印文件名。
perl -0777 -nE 'say "$ARGV @{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*
同样,通过使用不同的字段分隔符
\t
。
perl -0777 -nE '$"="\t";say "$ARGV @{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*
所有的Perl解决方案都使用
baby-cart operator。通常不建议在生产代码中使用,但对于一行代码是可以接受的。
演示:
perl -0777 -nE 'say "@{[/(\d+\.\d*|\.\d+|\d+)/g]}"' <<< "some-111-decimal-222.-another-333.33-only-frac-.444.txt"
输出
111 222. 333.33 .444