Sql 向BASH中字符串中的数字添加一个数字

Sql 向BASH中字符串中的数字添加一个数字,sql,bash,parsing,Sql,Bash,Parsing,我有一个sql文件需要修改,以便将行的ID部分增加3。如何增加ID字段并保持行的其余部分与BASH中的相同? 例: 我需要加上3到35,36和37,使它们变成38,39,40。因此,输出将是 insert into info.names values (38, 'John', 'C', 2); insert into info.names values (39, 'Mark', 'C', 1); insert into info.names values (40, 'Bob', 'C', 5);

我有一个sql文件需要修改,以便将行的ID部分增加3。如何增加ID字段并保持行的其余部分与BASH中的相同? 例:

我需要加上3到35,36和37,使它们变成38,39,40。因此,输出将是

insert into info.names values (38, 'John', 'C', 2);
insert into info.names values (39, 'Mark', 'C', 1);
insert into info.names values (40, 'Bob', 'C', 5);
我想在BASH中这样做


谢谢

使用gnu awk,您可以执行以下操作:

awk 'BEGIN{ FPAT="[^(]+|\\([0-9]+" } {$2="(" substr($2,2)+3} 1' file.sql
insert into info.names values  (38 , 'John', 'C', 2);
insert into info.names values  (39 , 'Mark', 'C', 1);
insert into info.names values  (40 , 'Bob', 'C', 5);

awk是执行此任务的更合适的工具

 awk '{tmp=$5 ;sub(/^\(/, "", tmp); tmp+=3; $5="("tmp","; print $0}' file > file.new && mv file.new file
为了解释,我将添加注释并使用更详细的格式

 awk '{  
       # Capture the 5th field '(35,' into a tmp variable
       tmp=$5                                    
       # remove the leading "(" char
       sub(/^\(/, "", tmp)
       # add 3 to the tmp value (see note below)
       tmp+=3
       # reconstruct the 5th field adding "(" and "," as needed.
       $5="(" tmp ","
       # print the whole line
       print $0
     }' file > file.new && mv file.new file
  #     |                  |-> if no error (`&&`) overwrite the original file 
  #     |                        with the fixed file (not an awk feature)
  #     |-> write output to tmp file                                                            
注意,在操作
sub(/^\(/,“”,tmp)
之后,tmp的值实际上是
35,
(注意
char!)。当在数字上下文中给定一个变量时(如
+=3
)awk将只处理该值的数字部分,然后执行数学运算。这就是为什么会得到
38
而不是
35,3
。接下来的行“put's back”缺少的“(”和“,”字符


谢谢。我不是awk大师,所以有些事情我不明白。这是我所做的,但肯定比你们所有人的答案要混乱得多

sed -n -r 's/^insert .*\(([0-9]+),.*;/\1/p' Names.sql | while read line; do grep "^insert into info.names values ($line," Names.sql | while read SQLLine; do OLDID=$(echo "$SQLLine" | sed -n -r 's/^insert .*\(([0-9]+),.*;/\1/p'); NEWID=$(expr 2 + $OLDID); sed -n -r "s/(insert into info.names values \()[0-9]+(, .*)/\1$NEWID\2/p" <(echo "$SQLLine"); done; done

sed-n-r's/^insert.*([0-9]+),.*;/\1/p'Names.sql;读取行时;do grep“^插入info.Names值($line,$Names.sql);读取SQLLine时;do OLDID=$(echo“$SQLLine”| sed-n-r's/^insert.*([0-9]+),./\1/p');NEWID=$(expr 2+$OLDID);sed-n-r“s/(插入info.Names值)\[0-9]/$p])只有行中的第一个数字?我注意到您的代码不包含左括号。例如:插入info.names值(38,'John','C',2);。输出将是:插入info.names值(41,'John','C',2);我认为这被否决了,因为这不是一个很好的答案。你可能把它放在这里是为了显示你的代码是什么。你可以将它按原样移动到你的问题中,以显示你试图解决问题。然后删除此答案,以便重新获得你失去的信誉点。祝你好运。
sed -n -r 's/^insert .*\(([0-9]+),.*;/\1/p' Names.sql | while read line; do grep "^insert into info.names values ($line," Names.sql | while read SQLLine; do OLDID=$(echo "$SQLLine" | sed -n -r 's/^insert .*\(([0-9]+),.*;/\1/p'); NEWID=$(expr 2 + $OLDID); sed -n -r "s/(insert into info.names values \()[0-9]+(, .*)/\1$NEWID\2/p" <(echo "$SQLLine"); done; done