用'sed'添加

Lui*_*rzi 45 sed math

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

你的任务,如果你选择接受它,就是实现乘法。

  • +1 这是一个很好的例子,说明与创造力相结合的误解可以滋生。 (17认同)
  • 还有人说编程不是数学。这颗小宝石反驳了他们。有史以来对 Base 1 的最佳使用。 (6认同)
  • +1 的挑战,喜欢它!也许这对 [Code Golf](http://codegolf.stackexchange.com) 有用;-p (5认同)

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)

  • 也可以在没有捕获括号的情况下执行此操作:`perl -pe 's/[0-9]+/$&amp;+3/e'` (3认同)

gle*_*man 10

只需将字符串输入计算器

 echo 12 | sed 's/[0-9]*/&+3/' | bc
Run Code Online (Sandbox Code Playgroud)


mic*_*lpm 8

我真的不明白为什么接受答案的极端复杂性,以下任何一个都可以满足您的需求:

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,但我不确定。


man*_*ork 5

如果您确实必须将正则表达式和算术运算结合起来,请选择一种语言,其中正则表达式的替换参数可以是回调函数。

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)