我正在尝试使用 执行数学运算sed
,但它继续将我的变量视为字符串。输入是这样的:
$ echo 12 | sed 's/[0-9]*/&+3/'
$ 12+3
我想要 15 作为输出。我只需要在一篇文章中进行运算并替换其数学结果,因为我将程序作为 Python 守护进程运行,并且我想避免诸如stdout
在文件上重定向、打开这些文件、执行操作、提取结果等段落替代品。对我来说,sed
似乎最好的方式是在一条线上执行所有操作。
我尝试以各种方式投射输入和输出,例如
$ echo 12 | sed 's/[0-9]*/int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'
$ echo 12 | sed 's/[0-9]*/\int(&+3)/'
但结果总是打印第二个字段。
答案1
如果你真的想使用 sed,那么可以这样:
s/[0-9]/<&/g
s/0//g; s/1/|/g; s/2/||/g; s/3/|||/g; s/4/||||/g; s/5/|||||/g; s/6/||||||/g
s/7/|||||||/g; s/8/||||||||/g; s/9/|||||||||/g
: tens
s/|</<||||||||||/g
t tens
s/<//g
s/+//g
: minus
s/|-|/-/g
t minus
s/-$//
: back
s/||||||||||/</g
s/<\([0-9]*\)$/<0\1/
s/|||||||||/9/; s/||||||||/8/; s/|||||||/7/; s/||||||/6/; s/|||||/5/; s/||||/4/
s/|||/3/; s/||/2/; s/|/1/
s/</|/g
t back
输入:
1+2
100+250
100-250
输出:
3
350
-150
如果您选择接受的话,您的任务就是实现乘法。
答案2
sed
不是这里的最佳选择,它本身并不进行算术运算(请参阅增加一个数字不过你怎么可能做到这一点)。你可以这样做awk
:
$ echo 12 | awk '{print $0+3}'
15
使用的最佳代码取决于您输入的确切格式以及您想要/需要执行的操作(如果它不是数字或包含多个数字等)。
您也可以仅使用以下命令来执行此操作bash
:
$ echo $(( $(echo 12) + 3 ))
或expr
以类似的方式使用。
答案3
我试图接受你的挑战@Richter,这就是我使用你的部分代码所做的:
sed 's/[0-9]/<&/g
s/0//g; s/1/|/g; s/2/||/g; s/3/|||/g; s/4/||||/g; s/5/|||||/g; s/6/||||||/g
s/7/|||||||/g; s/8/||||||||/g; s/9/|||||||||/g
: tens
s/|</<||||||||||/g
t tens
s/<//g
s/.*\*$/0/
s/^\*.*/0/
s/*|/*/
: mult
s/\(|*\)\*|/\1<\1*/
t mult
s/*//g
s/<//g
: back
s/||||||||||/</g
s/<\([0-9]*\)$/<0\1/
s/|||||||||/9/; s/||||||||/8/; s/|||||||/7/; s/||||||/6/; s/|||||/5/; s/||||/4/
s/|||/3/; s/||/2/; s/|/1/
s/</|/g
t back'
输入:
04*3
4*3
40*3
42*32
150*20
1*3
3*1
0*3
3*0
输出:所有正确结果
答案4
只需将字符串输入计算器即可
echo 12 | sed 's/[0-9]*/&+3/' | bc