文本文件中的算术替换

jav*_*ved 4 awk sed

我有一个这样的文件:

id=1+5
id=1+9
id=25100+10
xyz=1+
abc=123456
conf_string=LMN,J,IP,25100+1,0,3,1
Run Code Online (Sandbox Code Playgroud)

我想将 x+y 的实例替换为 (x+y) 的值。即1+5被6替换,25100+1被25001替换等等。

我正在尝试使用 gawk 来匹配正则表达式,例如/[:digit:]++[+digit:]+/ 使用以下内容我可以替换一些实例。

gawk 'BEGIN {FS = "[=+,]"} ; /[:digit:]++[+digit:]+/ {print $1 "=" ($2 + $3)} ! /[:digit:]++[+digit:]+/ {print $0}' /tmp/1.txt 
Run Code Online (Sandbox Code Playgroud)
id=6
id=10
id=25110
xyz=1+
abc=123456
conf_string=LMN,J,IP,25100+1,0,3,1
Run Code Online (Sandbox Code Playgroud)

我不确定如何匹配和替换上面示例中的 (25100+1) 。理想情况下,我想提取 的所有实例<number> + <number>并将其替换为总和。它始终是两个数字的和。

Sun*_*eep 6

GNU awk

$ awk 'BEGIN{r = @/([0-9]+)\+([0-9]+)/}
       { while(match($0, r, m)) sub(r, m[1] + m[2]) } 1' ip.txt
id=6
id=10
id=25110
xyz=1+
abc=123456
conf_string=LMN,J,IP,25101,0,3,1
Run Code Online (Sandbox Code Playgroud)
  • r=@/([0-9]+)\+([0-9]+)/将正则表达式保存在变量中,[0-9]将匹配所有数字
  • match($0, r, m)如果正则表达式匹配则为 true,匹配的部分将在m数组中可用
  • m[1] + m[2]将两个数字相加
  • 对于旧版本,awk '{while(match($0, /([0-9]+)\+([0-9]+)/, m)) sub(/([0-9]+)\+([0-9]+)/, m[1] + m[2]) } 1' ip.txt不支持将正则表达式保存在变量中

笔记

  • [:digit:]应该在字符类中使用[[:digit:]]
  • ++应该是你想要的第二个字面+\+匹配+

另请参阅:如何强制 AWK 将字符串计算为数学表达式?


perl可以简单地使用e标志来评估替换代码

perl -pe 's/(\d+)\+(\d+)/$1+$2/ge' ip.txt
# or    
perl -pe 's/\d+\+\d+/$&/gee' ip.txt
Run Code Online (Sandbox Code Playgroud)