Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix将特定关键字之间的多行压缩为一行_Unix_String Concatenation - Fatal编程技术网

Unix将特定关键字之间的多行压缩为一行

Unix将特定关键字之间的多行压缩为一行,unix,string-concatenation,Unix,String Concatenation,我的团队通过前端工具获得Teradata DDL文件。这些文件需要在执行之前更正。 其中的一个步骤是在单行上获取DDL命令 例如。 创建表ABC A列varchar2100, B栏编号10 ; 将视图ABC_v替换为 从中选择A列、B列 ABC 应改为 创建表ABC列A varchar2100,列B编号10 将视图ABC_v替换为从ABC中选择A列、B列 简而言之,我希望用多行字符串中的单个空格替换每一个新行字符。 字符串可以以create、replace或drop开头,并且始终以a结尾;分号

我的团队通过前端工具获得Teradata DDL文件。这些文件需要在执行之前更正。 其中的一个步骤是在单行上获取DDL命令

例如。 创建表ABC A列varchar2100, B栏编号10 ;

将视图ABC_v替换为 从中选择A列、B列 ABC

应改为

创建表ABC列A varchar2100,列B编号10

将视图ABC_v替换为从ABC中选择A列、B列

简而言之,我希望用多行字符串中的单个空格替换每一个新行字符。 字符串可以以create、replace或drop开头,并且始终以a结尾;分号
提前感谢您的帮助

这里有一个简单的shell解决方案:

#!/bin/sh

while read first rest; do
  case "$first" in
    create|replace|drop) echo "" ;;
  esac
  printf "%s %s " "$first" "$rest"
done < inputfile
echo ""
该解决方案不只是在关键字前加一个换行符,而是在变量中构建输出行,然后在完成后打印它们

或者,您可以使用sed实现相同的想法:

sed -rne '/^(create|replace|drop) /{;x;s/\n/ /g;/./p;d;};H;${;x;s/\n/ /g;p;}' inputfile
在这三种解决方案中,我都没有检查输入字符串是否以分号结尾。一旦您决定如何处理该故障,您可以将该检查添加到每个检查中。报告错误?通过电子邮件发送命令?忽略它


还要注意,DDL和SQL一样,应该能够解释多行上提供的命令。SQL与空格无关-不带引号的换行符应该与空格相同,尽管Teradata的行为可能不同。

我认为您需要更新示例。否则,我们只能说sed-e的/\.\.//g会抹掉所有点组之间的空格…除了偶尔插入或删除空格之外,我仍然看不出有什么区别。现在还不清楚您在寻找什么,或者您实际完成了什么…再次更新,希望现在很清楚除了代码中的create/replace/drop之外,还会有其他命令吗?命令在输入时是一行还是多行?命令之间是否总是有空行?能完成这项工作的最不同的命令有奖吗?我希望是编辑/更正过程,而不是Teradata SQL,需要每行一条语句。@JonathanLeffler-啊,那么这也许不是一个毫无用处的答案
sed -rne '/^(create|replace|drop) /{;x;s/\n/ /g;/./p;d;};H;${;x;s/\n/ /g;p;}' inputfile