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> 被解释为文字 12。 您需要添加额外的反斜杠来转义它们。此外,$(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