我正在尝试使用 执行数学运算sed
,但它继续将我的变量视为字符串。输入是这样的:
$ echo 12 | sed 's/[0-9]*/&+3/'
$ 12+3
Run Code Online (Sandbox Code Playgroud)
我想要 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)/'
Run Code Online (Sandbox Code Playgroud)
但结果总是打印第二个字段。
Sim*_*ter 89
如果你真的想使用 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
Run Code Online (Sandbox Code Playgroud)
输入:
1+2
100+250
100-250
Run Code Online (Sandbox Code Playgroud)
输出:
3
350
-150
Run Code Online (Sandbox Code Playgroud)
你的任务,如果你选择接受它,就是实现乘法。
Mat*_*Mat 24
sed
在这里不是最好的选择,它本身不进行算术运算(请参阅增加一个数字以了解您可能如何做到这一点)。你可以这样做awk
:
$ echo 12 | awk '{print $0+3}'
15
Run Code Online (Sandbox Code Playgroud)
要使用的最佳代码将取决于您输入的确切格式以及如果它不是数字或包含多个数字等您想要/需要做什么。
你也可以只用bash
:
$ echo $(( $(echo 12) + 3 ))
Run Code Online (Sandbox Code Playgroud)
或expr
以类似的方式使用。
Lui*_*rzi 17
我试图接受你的挑战@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'
Run Code Online (Sandbox Code Playgroud)
输入:
04*3
4*3
40*3
42*32
150*20
1*3
3*1
0*3
3*0
Run Code Online (Sandbox Code Playgroud)
输出:所有正确的结果
Pet*_*r.O 15
perl
允许与sed
's非常相似的构造......一个区别是perl
可以做更复杂的事情......sed
非常适合简单的文本替换
echo 'a12' | perl -pe 's/([0-9]+)/($1+3)/e' # the trailing /e means evaluate
Run Code Online (Sandbox Code Playgroud)
输出
a15
Run Code Online (Sandbox Code Playgroud)
gle*_*man 10
只需将字符串输入计算器
echo 12 | sed 's/[0-9]*/&+3/' | bc
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么接受答案的极端复杂性,以下任何一个都可以满足您的需求:
echo 12 | sed 's/[0-9]*/echo \$(( & + 3 ))/e'
Run Code Online (Sandbox Code Playgroud)
或者
echo 12 | sed 's/[0-9]*/expr & + 3/e'
Run Code Online (Sandbox Code Playgroud)
我认为它可能需要 GNU sed,但我不确定。
如果您确实必须将正则表达式和算术运算结合起来,请选择一种语言,其中正则表达式的替换参数可以是回调函数。
Perl、Ruby、JavaScript 和 Python 是这样的语言:
bash-4.2$ echo 12 | perl -pe 's/\d+/$&+3/e'
15
bash-4.2$ echo 12 | ruby -pe '$_.sub!(/\d+/){|s|s.to_i+3}'
15
bash-4.2$ echo 12 | js -e 'print(readline().replace(/\d+/,function(s){return parseInt(s)+3}))'
15
bash-4.2$ echo 12 | python -c 'import re;print re.sub("\d+",lambda s:str(int(s.group(0))+3),raw_input())'
15
Run Code Online (Sandbox Code Playgroud)