Sql 向BASH中字符串中的数字添加一个数字
我有一个sql文件需要修改,以便将行的ID部分增加3。如何增加ID字段并保持行的其余部分与BASH中的相同? 例: 我需要加上3到35,36和37,使它们变成38,39,40。因此,输出将是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);
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