我有一个这样的文件:
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>并将其替换为总和。它始终是两个数字的和。
和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:]]++应该是你想要的第二个字面+\+匹配+您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)