其他一些变体:
下面的每个示例都使用这个正则表达式:
(\d+\.\d*|\.\d+|\d+)
它匹配,(在一组中)ddd.ddd.ddd.dddddd。如果您的小数不同,例如不想捕获 .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