添加“sed”

添加“sed”

我正在尝试使用 执行数学运算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

相关内容