我的团队获取通过前端工具生成的Teradata DDL文件。执行前需要纠正这些文件。 这样做的一步是将DDL命令放在一行
E.g。
创建表ABC
(列A varchar2(100),
B栏编号(10)
);
将视图ABC_v替换为
从中选择columnA,B列
ABC;
应该改为
创建表ABC(列A varchar2(100),列B号(10));
将视图ABC_v替换为选择列A,来自ABC的列B;
简而言之,我希望用多行字符串中的单个空格替换每个新行字符。
该字符串可以以创建,替换或 drop 开头,它始终以; (分号)结尾
在此先感谢您的帮助
答案 0 :(得分:1)
这是shell中的一个简单解决方案:
#!/bin/sh
while read first rest; do
case "$first" in
create|replace|drop) echo "" ;;
esac
printf "%s %s " "$first" "$rest"
done < inputfile
echo ""
这会在输出的开头添加一个空行,因为我是懒惰的。但你确实看到了逻辑。为避免出现空白行,您可以使用临时变量来确定您是否真正开始提取输入数据。
你可以使用awk做类似的事情:
awk '
BEGIN {
a["create"];
a["replace"];
a["drop"];
}
$1 in a && h {
print substr(h,2);h="";
}
{
h=h" "$0;
}
END {
print substr(h,2);
}
' inputfile
此解决方案不是简单地在关键字之前添加换行符,而是在变量中构建输出行,然后在它们完成时打印它们。
或者,您可以使用sed实现相同的想法:
sed -rne '/^(create|replace|drop) /{;x;s/\n/ /g;/./p;d;};H;${;x;s/\n/ /g;p;}' inputfile
在所有这三种解决方案中,我都没有费心去检查输入字符串是否以分号结尾。一旦确定了处理失败的方式,您就可以将检查添加到每个检查中。 (报告错误?通过电子邮件发送命令?忽略它?)
另请注意,DDL与SQL一样,应该能够解释多行提供的命令。 SQL是空白不可知的 - 一个不带引号的换行符应该与空格相同(尽管Teradata可能表现不同)。