我有这个字符串:
1024.00 MB transferred (912.48 MB/sec)
我需要只使用数字912.48
并使用bash脚本在912,48
中对其进行转换。
我尝试sed 's/[^0-9.]*//g'
,但这样我得1024.00 912.18
。
我该怎么办?
答案 0 :(得分:2)
到目前为止,此处的每个答案都使用外部工具(sed
,awk
,grep
,tr
等),而不是坚持本机bash功能。由于旋转外部过程具有显着的恒定时间性能影响,因此当仅处理单行内容时(对于长内容流,外部工具通常会更有效),它通常是不合需要的。
这只使用内置插件:
# one-time setup: set the regex
re='[(]([0-9.]+) MB/sec[)]'
string='1024.00 MB transferred (912.48 MB/sec)'
if [[ $string =~ $re ]]; then # run enclosed code only if regex matches
val=${BASH_REMATCH[1]} # refer to first (and only) match group
val_with_comma=${val//./,} # replace "." with "," in that group
echo "${val_with_comma}" # ...and emit our output
fi
...得到以下特性:
912,48
答案 1 :(得分:1)
这应该有效
$ sed -r 's/.*\(([0-9.]+).*/\1/;s/\./,/'
答案 2 :(得分:1)
echo "1024.00 MB transferred (912.48 MB/sec)" | cut -f2 -d'(' | cut -f1 -d' ' | sed 's/\./,/'
答案 3 :(得分:1)
awk
和sed
的组合:
str='1024.00 MB transferred (912.48 MB/sec)'
echo "$str" | awk '{print $4}' | sed 's/(//;s/\./,/'
912,48
或完全使用awk
:
echo "$str" | awk '{sub("[(]","");sub("[.]",",");print $4}'
答案 4 :(得分:0)
echo "1024.00 MB transferred (912.48 MB/sec)" | cut -d " " -f4 | tr "." "," | tr -d "("
答案 5 :(得分:0)
另一种近乎无限的可能性:
read x y < <(tr -dc '[0-9. ]' <<< "1024.00 MB transferred (912.48 MB/sec)")
echo ${y}
或
grep -oP '(?<=\()[\d.]+' <<< "1024.00 MB transferred (912.48 MB/sec)"
答案 6 :(得分:0)
这是完成工作的awk
:
s='1024.00 MB transferred (912.48 MB/sec)'
awk -F '[() ]+' '{sub(/\./, ",", $4); print $4}' <<< "$s"
912,48
答案 7 :(得分:0)
这是我的,应该很快:
grep -o '([^ ]\+' | tail -c+2 | tr '.' ','