+ 和 - 交替求和
Alternating + and - in a sum
我正在寻找一种在由加号 atm 分隔的一整串数字中交替使用 + 和 - 的方法。
我需要它是 Number1 - Number2 + Number3 - Number4 等。
它必须是一个命令行命令(希望有意义o_0)并且我需要能够将巨大的总和输入其中。所以最好的是一个 sed 命令。谢谢!
到目前为止我的命令行:
cat oneven.txt | sed 's/\(\w\)/4\//g' | bc -l | sed 's/^\(.*\)$/ +/g' |sed 's/\(\w.*\w\)+\(\w.*\w\)/-/g'| tr "\n" " " | cut -c -11998
Oneven ==> 不均匀(它包含直到 1000 的所有数字(您猜对了)不均匀。
尝试过:一个 sed 命令,它将接受一对数字并将它们之间的 + 更改为最小值。没有结果。没有添加任何缺点
示例(交替前):
4.00000000000000000000 + 1.33333333333333333333 + .80000000000000000000 + .57142857142857142857 + .44444444444444444444 + .28571428571428571428 + .09523809523809523809 + .05714285714285714285 + .04081632653061224489 + .03174603174603174603 + .16666666666666666666 + .05555555555555555555 + .03333333333333333333 + .02380952380952380952 + .01851851851851851851 + .11764705882352941176 + .03921568627450980392 + .02352941176470588235 + .01680672268907563025 + .01307189542483660130 + .09090909090909090909 + .03030303030303030303 + .01818181818181818181 + .01298701298701298701 + .01010101010101010101 + .07407407407407407407 + .02469135802469135802 + .01481481481481481481 + .01058201058201058201 + .00823045267489711934 + .06250000000000000000 + .02083333333333333333 + .01250000000000000000 + [...]
我需要它是 Number1 - Number2 + Number3 - Number4 等等。
它必须是一个命令行命令(希望有意义 o_0)并且我需要能够将巨大的总和输入其中。
如果您的输入在一行中,那么您不需要 tr
命令。如果不是,那么 tr
应该在 sed
之前,因为 sed
分别处理每一行,如果数字对在不同的行上,解决方案将不起作用。
至于解决方案本身,你的想法是在数字对之间加上一个加号是好的,但是你没有为此指定一个足够好的正则表达式,所以它没有用。这是我的:
sed -e 's/\([^-+]\+\)+\([^-+]\+\)/-/g'
这表示:
- 既不是
+
也不是-
的非空字符串
- 后跟
+
- 后跟另一个这样的字符串。
您的正则表达式 (\(\w.*\w\)+\(\w.*\w\)
) 是错误的,因为它实际上意味着:
- 一个字字符
- 零个或多个不受约束的字符
- 另一个词字符
+
- 一个字字符
- 零个或多个不受约束的字符
- 另一个词字符
为什么错了?因为你的加号实际上不是被单词字符包围的,而是被空格包围的。所以这实际上与线上的任何内容都不匹配。
即使考虑到空格,这仍然与您的实际数字不匹配,因为其中一些以小数点开头,这不是单词字符。
即使你修复了它,.*
也会匹配加号,这意味着如果它贪心,它可能只会替换最后一个加号。
我正在寻找一种在由加号 atm 分隔的一整串数字中交替使用 + 和 - 的方法。 我需要它是 Number1 - Number2 + Number3 - Number4 等。 它必须是一个命令行命令(希望有意义o_0)并且我需要能够将巨大的总和输入其中。所以最好的是一个 sed 命令。谢谢!
到目前为止我的命令行:
cat oneven.txt | sed 's/\(\w\)/4\//g' | bc -l | sed 's/^\(.*\)$/ +/g' |sed 's/\(\w.*\w\)+\(\w.*\w\)/-/g'| tr "\n" " " | cut -c -11998
Oneven ==> 不均匀(它包含直到 1000 的所有数字(您猜对了)不均匀。
尝试过:一个 sed 命令,它将接受一对数字并将它们之间的 + 更改为最小值。没有结果。没有添加任何缺点 示例(交替前):
4.00000000000000000000 + 1.33333333333333333333 + .80000000000000000000 + .57142857142857142857 + .44444444444444444444 + .28571428571428571428 + .09523809523809523809 + .05714285714285714285 + .04081632653061224489 + .03174603174603174603 + .16666666666666666666 + .05555555555555555555 + .03333333333333333333 + .02380952380952380952 + .01851851851851851851 + .11764705882352941176 + .03921568627450980392 + .02352941176470588235 + .01680672268907563025 + .01307189542483660130 + .09090909090909090909 + .03030303030303030303 + .01818181818181818181 + .01298701298701298701 + .01010101010101010101 + .07407407407407407407 + .02469135802469135802 + .01481481481481481481 + .01058201058201058201 + .00823045267489711934 + .06250000000000000000 + .02083333333333333333 + .01250000000000000000 + [...]
我需要它是 Number1 - Number2 + Number3 - Number4 等等。 它必须是一个命令行命令(希望有意义 o_0)并且我需要能够将巨大的总和输入其中。
如果您的输入在一行中,那么您不需要 tr
命令。如果不是,那么 tr
应该在 sed
之前,因为 sed
分别处理每一行,如果数字对在不同的行上,解决方案将不起作用。
至于解决方案本身,你的想法是在数字对之间加上一个加号是好的,但是你没有为此指定一个足够好的正则表达式,所以它没有用。这是我的:
sed -e 's/\([^-+]\+\)+\([^-+]\+\)/-/g'
这表示:
- 既不是
+
也不是-
的非空字符串
- 后跟
+
- 后跟另一个这样的字符串。
您的正则表达式 (\(\w.*\w\)+\(\w.*\w\)
) 是错误的,因为它实际上意味着:
- 一个字字符
- 零个或多个不受约束的字符
- 另一个词字符
+
- 一个字字符
- 零个或多个不受约束的字符
- 另一个词字符
为什么错了?因为你的加号实际上不是被单词字符包围的,而是被空格包围的。所以这实际上与线上的任何内容都不匹配。
即使考虑到空格,这仍然与您的实际数字不匹配,因为其中一些以小数点开头,这不是单词字符。
即使你修复了它,.*
也会匹配加号,这意味着如果它贪心,它可能只会替换最后一个加号。