我试图将整数包装在SQL文件中的引号中。转储的SQL包含一个整数列,我想将其转换为字符串,因为它会截断邮政编码的前导零。
我如何知道零被截断?所有邮政编码均为5个字符。具有4的那些具有前导零截断。例如:
INSERT INTO cities VALUES(21919,'MD','Maryland','Earleville',39.427105,-75.94031);
INSERT INTO cities VALUES(21921,'MD','Maryland','Elkton',39.626434,-75.84584);
INSERT INTO cities VALUES(1001,'MA','Massachusetts','Agawam',42.070206,-72.622739);
INSERT INTO cities VALUES(1002,'MA','Massachusetts','Cushman',42.377017,-72.51565);
通缉结果:
INSERT INTO cities VALUES('21919','MD','Maryland','Earleville',39.427105,-75.94031);
INSERT INTO cities VALUES('21921','MD','Maryland','Elkton',39.626434,-75.84584);
INSERT INTO cities VALUES('01001','MA','Massachusetts','Agawam',42.070206,-72.622739);
INSERT INTO cities VALUES('01002','MA','Massachusetts','Cushman',42.377017,-72.51565);
前两个应该简单地包裹起来。其他两个应该添加前导零。
两个要求:
我能够使用
获得所有4位数字grep "([[:digit:]]\{4\}," cities.sql
或模式
\([0-9]{4},
但我不确定如何将值包装到引号中,也不确定如何使用sed添加前导零。
答案 0 :(得分:1)
它必须是sed吗?如果你可以使用awk,你可以这样做:
cat cities.sql | awk -F'[,(]' '{printf "%s('\''%05d'\'',%s,%s,%s,%s,%s\n", $1, $2, $3, $4, $5, $6, $7 }'
答案 1 :(得分:1)
使用gnu-awk非常简单:
awk 'match($0, /^(.+?)(\<[0-9]{4,5})(,.+)$/, a) {
printf "%s\047%05d\047%s\n", a[1], a[2], a[3] }' file
INSERT INTO cities VALUES('21919','MD','Maryland','Earleville',39.427105,-75.94031);
INSERT INTO cities VALUES('21921','MD','Maryland','Elkton',39.626434,-75.84584);
INSERT INTO cities VALUES('01001','MA','Massachusetts','Agawam',42.070206,-72.622739);
INSERT INTO cities VALUES('01002','MA','Massachusetts','Cushman',42.377017,-72.51565);
答案 2 :(得分:0)
你可以一个接一个地做:首先,添加前导零,然后用单引号换行:
cat cities.sql \
| sed -e "s/(\([0-9]\{4\}\)/(0\1/" \
| sed -e "s/(\([0-9]\{5\}\)/(\'\1\'/" \
> cities2.sql
正如你所看到的,我使用的事实是整数前面总是以“(”表示其他数字不受影响。如果情况并非总是如此,则需要相应地调整正则表达式。
为了包装你可以使用分组将你想要提取的位包装到\(... \)中,然后你可以在你的替换字符串中用\ 1按时间顺序引用它, \ 2等。
祝你好运, smuecke