无法一次执行多个sed操作

无法一次执行多个sed操作,sed,ksh,Sed,Ksh,嗨,我需要一次执行多个sed操作,然后将输出刷新到一个文件中。 我有一个.dat文件,它的数据如下 指标.dat 航空工业-A.航空工业-0000-00-00 Rpting_Ind-Case当Dstbr_Id为空时,则“N”或“Y”结束Rpting_Ind-0000-00-00 纬度,经度-A.Store_纬度纬度,A.Store_经度经度-0000-00-00 聚结直接工业,-聚结直接工业,-0004-01-01 合并项目管理直接索引,-合并直接帐户索引,-0004-02-02 聚结PM\U

嗨,我需要一次执行多个sed操作,然后将输出刷新到一个文件中。 我有一个.dat文件,它的数据如下

指标.dat

航空工业-A.航空工业-0000-00-00 Rpting_Ind-Case当Dstbr_Id为空时,则“N”或“Y”结束Rpting_Ind-0000-00-00 纬度,经度-A.Store_纬度纬度,A.Store_经度经度-0000-00-00 聚结直接工业,-聚结直接工业,-0004-01-01 合并项目管理直接索引,-合并直接帐户索引,-0004-02-02 聚结PM\U Snus\U Direct\U Ind,-COLEASCEDIRECT\U Acct\U Ind,-0004-01-02 聚结PM\U Snuf\U Direct\U Ind,-COLEASCEDIRECT\U Acct\U Ind,-0004-04-02 联合财务管理委员会Cgr直接投资公司-联合直接投资会计公司-2000-02-01 合并直接工业,-合并直接工业,-1070-02-02 联合直接工业,-联合直接工业,-1070-01-02 联合直接工业公司-联合直接工业公司-1070-04-02

现在,我尝试替换名为indicator.sql的文件中定义的参数,并将输出刷新到一个文件中

指标_.sql:

在任何时间点都不会输入else块

#!/bin/sh
rm ./Source_tmp.sql
touch ./Source_tmp.sql
while read line
do
MIM=`echo $line | cut -d " " -f1 `
EDW=`echo $line | cut -d "-" -f2 `
Company_Cd=`echo $line | cut -d "-" -f3 `
Prod_Type_Cd=`echo $line | cut -d "-" -f4 `
Prod_Catg_Cd=`echo $line | cut -d "-" -f5 `
echo "Select top 10 * from (" >> ./Source_tmp.sql ;
sed "s/Param1/$MIM/g" indicator.sql >> Source_tmp.sql;

echo "minus">> Source_tmp.sql;



if [ "$MIM"="Air_Ind " ] || [ "$MIM"="Rpting_Ind " ] || [ "$MIM"="Latitude,Longitude " ]

then


sed "s/param1/$EDW/g" indicator_s.sql >> Source_tmp.sql

else



sed -e "s/--1/' '/g" -e  "s/param1/$EDW/g" -e "s/param2/$Company_Cd/g" -e "s/param3/$Prod_Type_Cd/g" -e "s/param4/$Prod_Catg_Cd/g"  ./indicator_s.sql >> ./Source_tmp.sql



fi

done <indicator.dat
输出应该像我定义的param1和param2等值一样,应该从indicator.dat文件中替换它们,并且需要在else块中取消注释注释注释的行 请帮助我

据我所知,sed命令正在工作。但它并没有产生预期的产出。我想是吧。给出一些输出示例:

[...]
' ' Where Company_Cd = ' 0000 '

' ' And Prod_Type_Cd = ' 00 '

' ' And Prod_Catg_Cd = ' 00'
[...]
很明显,在行首有额外的引号,并且在值周围有额外的间隔

这会解决您的问题吗:

#!/bin/bash

[...]

MIM=`echo -n $line | cut -d " " -f1 `
EDW=`echo -n $line | cut -d "-" -f2 `
Company_Cd=`echo -n $line | cut -d "-" -f3 `
Prod_Type_Cd=`echo -n $line | cut -d "-" -f4 `
Prod_Catg_Cd=`echo -n $line | cut -d "-" -f5 `

# Trim spaces as you "cut" on "-", keeping extra spaces arround
shopt -s extglob
EDW=${EDW%%+([[:space:]])}; EDW=${EDW##+([[:space:]])};
Company_Cd=${Company_Cd%%+([[:space:]])}; Company_Cd=${Company_Cd##+([[:space:]])};
Prod_Type_Cd=${Prod_Type_Cd%%+([[:space:]])}; Prod_Type_Cd=${Prod_Type_Cd##+([[:space:]])};
Prod_Catg_Cd=${Prod_Catg_Cd%%+([[:space:]])}; Prod_Catg_Cd=${Prod_Catg_Cd##+([[:space:]])};

[...]

# Fix "sed" in your "else" clause by removing extra single quotes
sed -e "s/--1/ /g" -e  "s/param1/$EDW/g" -e "s/param2/$Company_Cd/g" -e "s/param3/$Prod_Type_Cd/g" -e "s/param4/$Prod_Catg_Cd/g"  ./indicator_s.sql >> ./Source_tmp.sql
现在生成更有效的SQL:

  [...]
  Where Company_Cd = '0000'

  And Prod_Type_Cd = '00'

  And Prod_Catg_Cd = '00'
  [...]

话虽如此,这主要是一些黑客修复的一些?脚本中可能存在的各种问题。但整个事情似乎有点做作。而且易碎。例如,如果任何替换字符串包含&,则它将中断。这里是龙。

不可能告诉您希望脚本做什么,因为到目前为止,您只发布了一个脚本,它不会产生您想要的任何输出,并且您还没有发布您想要的输出,但是让我们从这个开始,您可以更新您的问题以显示预期的输出并澄清您的需求:

$ cat tst.awk
BEGIN{ FS="-" }
NR==FNR { template = (template ? template ORS : "") $0; next }
{
    split($0,arr,/ /)
    MIM = arr[1]
    EDW = $1
    Company_Cd = $3
    Prod_Type_Cd = $4
    Prod_Catg_Cd = $5

    $0 = "Select top 10 * from (\n" template

    gsub(/Param1/,MIM "\nminus")
    gsub(/param1/,EDW)

    if ( MIM !~ /^Air_Ind|Rpting_Ind|Latitude,Longitude/ ) {
        gsub(/--1/," ")
        gsub(/param2/,Company_Cd)
        gsub(/param3/,Prod_Type_Cd)
        gsub(/param4/,Prod_Catg_Cd)
    }

    print
}


我读到:我不知道为什么sed不在ksh的其他块中工作,但在您的脚本中,shebang是/bin/sh。请修复您的问题/示例/标记,以澄清您是否需要bash、sh或ksh答案。UNIX shell是调用工具的环境。处理文本文件内容的标准UNIX工具是awk。您应该编写一个awk脚本,它可以完成所有操作,并且只需从您喜欢的shell调用它即可。结果将比使用shell、sed、cut和其他命令的混合编写的任何命令都更加简洁和健壮。只要清楚地将1 indicator.dat、2 indicator.sql和3的示例发布到预期的工具输出中,我们就可以帮助您。我保证,与您目前正在尝试的操作相比,您对结果会更满意。indicator.sql中的每个数据行之间真的有空行吗?没有Ed,中间没有空行。它根本不会被替换。这就是问题所在。即使有额外的空格出现,这很好。如果我注释掉if block和else,或者它不是出自if block,那么if block是否有任何问题,因为sed正在工作。就像我遗漏了任何逻辑上的缺陷,这是修复它的if块
$ cat tst.awk
BEGIN{ FS="-" }
NR==FNR { template = (template ? template ORS : "") $0; next }
{
    split($0,arr,/ /)
    MIM = arr[1]
    EDW = $1
    Company_Cd = $3
    Prod_Type_Cd = $4
    Prod_Catg_Cd = $5

    $0 = "Select top 10 * from (\n" template

    gsub(/Param1/,MIM "\nminus")
    gsub(/param1/,EDW)

    if ( MIM !~ /^Air_Ind|Rpting_Ind|Latitude,Longitude/ ) {
        gsub(/--1/," ")
        gsub(/param2/,Company_Cd)
        gsub(/param3/,Prod_Type_Cd)
        gsub(/param4/,Prod_Catg_Cd)
    }

    print
}
$ awk -f tst.awk indicator.sql indicator.dat
Select top 10 * from (
Select A.Id,

 Air_Ind
minus

From Location A

--1Left Outer  Join

--1(

--1 Select

--1 Location_Id,

--1 Direct_Acct_Ind

--1 From Location_Bcbc D

--1 Where Company_Cd = 'param2'

--1 And Prod_Type_Cd = 'param3'

--1 And Prod_Catg_Cd = 'param4'

--1 ) A
Select top 10 * from (
Select A.Id,

 Rpting_Ind
minus

From Location A

--1Left Outer  Join

--1(

--1 Select

--1 Location_Id,

--1 Direct_Acct_Ind

--1 From Location_Bcbc D

--1 Where Company_Cd = 'param2'

--1 And Prod_Type_Cd = 'param3'

--1 And Prod_Catg_Cd = 'param4'

--1 ) A