0

我被要求帮助一个 UNIX 脚本,该脚本在有或没有来自一台机器和/或环境的数据的情况下与另一台机器一起部署数据库对象。问题是某些列的 CHAR 数据带有单引号。只有这些单引号需要转换为2个单引号。我正在考虑使用 sed 或 awk,但我无法弄清楚。有人有什么想法吗?例子:

INSERT INTO SQL_ERROR_MESSAGE (SQL_Error_Cd,Error_Text) VALUES (5492,'The argument for an INOUT/OUT parameter '%VSTR'  is invalid.');

变成

INSERT INTO SQL_ERROR_MESSAGE (SQL_Error_Cd,Error_Text) VALUES (5492,'The argument for an INOUT/OUT parameter ''%VSTR''  is invalid.');

谢谢你的支持。

4

1 回答 1

0

如果您对INSERT陈述的格式相当确定,这可能对您有用:

sed "s/\([^']\+'[^']\+\)\('\)\([^']\+\)'\(.*\)/\1\2\2\3\2\2\4/" INPUTFILE

但我建议检查输出:-)

基本上它捕获直到第二个(!)'(in \1)的所有内容,然后捕获第二个'\2) - 这不是必需的,我只是这样写的...... - 在应该被转义的 s\3之间的字符串中',最后字符串 ( ) 的剩余部分\4,并在替换中使用保存的条目。

示例输出(Linux、GNU sed):

$ sed "s/\([^']\+'[^']\+\)\('\)\([^']\+\)'\(.*\)/\1\2\2\3\2\2\4/"
INPUT LINE #=> INSERT INTO SQL_ERROR_MESSAGE (SQL_Error_Cd,Error_Text) VALUES (5492,'The argument for an INOUT/OUT parameter '%VSTR'  is invalid.');
OUTPUT LINE #=> INSERT INTO SQL_ERROR_MESSAGE (SQL_Error_Cd,Error_Text) VALUES (5492,'The argument for an INOUT/OUT parameter ''%VSTR''  is invalid.');
于 2013-07-22T14:03:19.063 回答