Unix Concat将特定关键字之间的多行划分为单行

时间:2014-06-30 16:25:10

标签: unix string-concatenation

我的团队获取通过前端工具生成的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 开头,它始终以; (分号)结尾
在此先感谢您的帮助

1 个答案:

答案 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可能表现不同)。