使用sed / grep将数字包装到引号中

时间:2015-07-22 21:13:21

标签: regex sed grep

我试图将整数包装在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);

前两个应该简单地包裹起来。其他两个应该添加前导零。

两个要求:

  1. 将所有邮政编码值包装成字符串
  2. 将前导零加至4位数字。
  3. 我能够使用

    获得所有4位数字
    grep "([[:digit:]]\{4\}," cities.sql
    

    或模式

    \([0-9]{4},
    

    但我不确定如何将值包装到引号中,也不确定如何使用sed添加前导零。

3 个答案:

答案 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