用sed替换包含未知数字的字符串

时间:2015-05-18 02:41:56

标签: sed

使用sed我想编辑一个数字而不知道它有多少位数。

EX1. 
variableA = 34, variableB = 4

EX2.
variableA = 123, variableB = 22

我希望能够在不知道原始数字的情况下更新这些变量中的任何一个。线的格式不会改变,但数值将会改变。

理想情况下,这将是一个用于替换数字赋值的表达式

3 个答案:

答案 0 :(得分:2)

使用正则表达式替换替换将执行此操作。不幸的是,那么你有一个问题和一个正则表达式。但无论如何:调整这些以用你真正的新价值取代42;我使用“,”或“$”来区分两个变量:

对于variableA

sed -e 's/= [0-9]\{1,\},/= 42,/'

对于variableB

sed -e 's/= [0-9]\{1,\}$/= 42/'

答案 1 :(得分:2)

试试这个单程解决方案:

n1=55 n2=66 # define replacement numbers

sed -E 's/^(.* = )[[:digit:]]+(, .* = )[[:digit:]]+$/\1'"$n1"'\2'"$n2"'/' <<EOF
variableA = 34, variableB = 4
variableA = 123, variableB = 22
EOF

这会产生:

variableA = 55, variableB = 66
variableA = 55, variableB = 66
  • 使用-E启用对扩展正则表达式的支持,这些正则表达式在语法方面更强大,更简单 - 这将适用于BSD / OSX和Linux平台。
  • 通过匹配整个行,可以使用一个 s///函数调用指定两个替换号码。
  • 将替换数字变量拼接到另一个单引号的Sed脚本中。

或者, 2-pass solution 如果您想按变量名称匹配

n1=55 n2=66 # define replacement numbers

sed -E 's/(variableA = )[[:digit:]]+/\1'"$n1"'/; s/(variableB = )[[:digit:]]+/\1'"$n2"'/' <<EOF
variableA = 34, variableB = 4
variableA = 123, variableB = 22
EOF
  • 进行两次单独的s///调用,每个变量一次。
  • 对于明确的名称和更灵活的空白匹配,这可以变得更加健壮,但为了简洁,我把它留了下来。

答案 2 :(得分:0)

您可以使用正则表达式

echo "variableA = 123, variableB = 22" | sed -e 's/\(variableA = \)[0-9]\+, \(variableB = \)[0-9]\+/\1999,\2888/'

结果:

variableA = 999,variableB = 888