sed 模式部分作为其他 bash 函数的输入
sed pattern parts as input for other bash function
我正在尝试用整数值 1200 替换像 1.2e + 3 这样的浮点数。为此,我按以下方式使用 sed:
echo '"1.2e+04"' | sed "s/\"\([0-9]\+\.[0-9]\+\)e+\([0-9]\+\)\"/$(echo *10^|bc -l)/"
但是模式部分 </code> 和 <code>
没有在 echo 中被评估。
有没有办法用sed解决这个问题?
提前致谢
使用perl
(或其他类型语言)管理变量类型可能更好:
echo '"1.2e+04"' | perl -lane 'my $a=$_;$a=~ s/"//g;print sprintf("%.10g",$a);print $a;'
无论如何,你的sed
表达式不正确,应该是:
echo '"1.2e+04"' | sed "s/\"\([0-9]\+\.[0-9]\+\)e+\([0-9]\+\)\"/$(echo *10^ + *10^$(echo - 1 | bc -l)|bc -l)/"
如果您对 awk
这样的命令感到满意,可以执行以下操作:
echo 1.2e+4|awk '{printf "%d",[=10=]}'
在双引号内,</code> 和 <code>
被解释为文字 1
和 2
。
您需要添加额外的反斜杠来转义它们。此外,$(command substitution)
在
sed
与反向引用结合使用时,替换似乎不起作用。
如果您使用 GNU sed
,您可以这样说:
echo '"1.2e+04"' | sed "s/\"\([0-9]\+\.[0-9]\+\)e+\([0-9]\+\)\"/echo \"\1*10^\2\"|bc -l/;e"
产生:
12000.0
如果你想去掉小数点,你就会知道怎么做了;-)。
正确解决问题的最佳方法是使用@tshiono 和@Romeo 解决方案的高级组合:
sed "s/\(.*\)\([0-9]\+\.[0-9]\+e+[0-9]\+\)\(.*\)/printf ''\; echo |awk '{printf \"%d\",$0}'\;printf ''\;/e"
因此可以将所有此类浮点数转换为任意上下文。
例如:
echo '"1.2e+04"' | sed "s/\(.*\)\([0-9]\+\.[0-9]\+e+[0-9]\+\)\(.*\)/printf ''\; echo |awk '{printf \"%d\",$0}'\;printf ''\;/e"
产出
"12000"
和
echo 'abc"1.2e+04"def' | sed "s/\(.*\)\([0-9]\+\.[0-9]\+e+[0-9]\+\)\(.*\)/printf ''\; echo |awk '{printf \"%d\",$0}'\;printf ''\;/e"
产出
abc"12000"def
我正在尝试用整数值 1200 替换像 1.2e + 3 这样的浮点数。为此,我按以下方式使用 sed:
echo '"1.2e+04"' | sed "s/\"\([0-9]\+\.[0-9]\+\)e+\([0-9]\+\)\"/$(echo *10^|bc -l)/"
但是模式部分 </code> 和 <code>
没有在 echo 中被评估。
有没有办法用sed解决这个问题? 提前致谢
使用perl
(或其他类型语言)管理变量类型可能更好:
echo '"1.2e+04"' | perl -lane 'my $a=$_;$a=~ s/"//g;print sprintf("%.10g",$a);print $a;'
无论如何,你的sed
表达式不正确,应该是:
echo '"1.2e+04"' | sed "s/\"\([0-9]\+\.[0-9]\+\)e+\([0-9]\+\)\"/$(echo *10^ + *10^$(echo - 1 | bc -l)|bc -l)/"
如果您对 awk
这样的命令感到满意,可以执行以下操作:
echo 1.2e+4|awk '{printf "%d",[=10=]}'
在双引号内,</code> 和 <code>
被解释为文字 1
和 2
。
您需要添加额外的反斜杠来转义它们。此外,$(command substitution)
在
sed
与反向引用结合使用时,替换似乎不起作用。
如果您使用 GNU sed
,您可以这样说:
echo '"1.2e+04"' | sed "s/\"\([0-9]\+\.[0-9]\+\)e+\([0-9]\+\)\"/echo \"\1*10^\2\"|bc -l/;e"
产生:
12000.0
如果你想去掉小数点,你就会知道怎么做了;-)。
正确解决问题的最佳方法是使用@tshiono 和@Romeo 解决方案的高级组合:
sed "s/\(.*\)\([0-9]\+\.[0-9]\+e+[0-9]\+\)\(.*\)/printf ''\; echo |awk '{printf \"%d\",$0}'\;printf ''\;/e"
因此可以将所有此类浮点数转换为任意上下文。
例如:
echo '"1.2e+04"' | sed "s/\(.*\)\([0-9]\+\.[0-9]\+e+[0-9]\+\)\(.*\)/printf ''\; echo |awk '{printf \"%d\",$0}'\;printf ''\;/e"
产出
"12000"
和
echo 'abc"1.2e+04"def' | sed "s/\(.*\)\([0-9]\+\.[0-9]\+e+[0-9]\+\)\(.*\)/printf ''\; echo |awk '{printf \"%d\",$0}'\;printf ''\;/e"
产出
abc"12000"def