如何从文件中的行构造字符串,然后根据结果文件中的行构建文件?

时间:2014-11-25 11:34:10

标签: bash

我开始编写我的第一个大型bash脚本,我试图解决一个问题。

我有一个文件:packagesList.txt,其中包含我需要通过sqlplus运行的oracle包的名称。该文件如下所示:

ORACLETASK1
ORACLETASK2

文件夹配置包含以包命名的文件。他们的名字就是这样的:ORACLETASK1-test.txtORACLETASK2-test.txt,他们的内容看起来完全像这样:

ORACLETASK1FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK1FUNCTION1(PARAMETER3, PARAMETER4)

ORACLETASK2

也是如此
ORACLETASK2FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK2FUNCTION1(PARAMETER3, PARAMETER4)

现在 - 我需要做的是生成一个文件(在循环中)ORACLETASK1-run.conf,如下所示:

ORACLETASK1.ORACLETASK1FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK1.ORACLETASK1FUNCTION1(PARAMETER3, PARAMETER4)
ORACLETASK2.ORACLETASK2FUNCTION1(PARAMETER1, PARAMETER2)
ORACLETASK2.ORACLETASK2FUNCTION1(PARAMETER3, PARAMETER4)

Finallz,我需要为ORACLETASK1-run.conf文件中的每一行生成(循环中)一系列sql文件,如下所示:

QUESTION UNRELATED SET AND CLEAR COMMANDS GO HERE

VARIABLE RC REFCURSOR;

并且最重要的一条线就在这里

EXEC :RC := ORACLETASK1.ORACLETASK1FUNCTION1(PARAMETER1, PARAMETER2); 

文件的其余部分

SPOOL SOME_FILE_NAME_I_DONT_KNOW_HOW_TO_NAME_IT_YET.TXT
PRINT RC;
SPOOL OFF
EXIT;

也许这个问题有点笼统,但我正在寻找任何可能导致我让这个脚本工作的线索...

2 个答案:

答案 0 :(得分:0)

这会让你朝着正确的方向前进:

CONFIGDIR="/path/to/config/files"

while read -r line ; do
  while read -r config ; do
    echo "$line.$config" >> "ORACLETASK1-run.conf"
  done < "$CONFIGDIR/$line-test.txt"
done < packagesList.txt

while read -r line ; do
  sqlfile=$(echo $line | sed -r 's/(.*\..*)\((.*), *(.*)\)/\1.\2.\3/'
  cat << _EOCFG_ >> "$sqlfile.sql"
VARIABLE RC REFCURSOR;
EXEC :RC := $line; 
SPOOL SOME_FILE_NAME_I_DONT_KNOW_HOW_TO_NAME_IT_YET.TXT
PRINT RC;
SPOOL OFF
EXIT;
_EOCFG_
done < ORACLETASK1-run.conf

答案 1 :(得分:0)

因此,您需要阅读脚本所在的文件和名为Configuration的子文件夹。

您需要执行类似

的操作
for i in *.txt Configuration/*.txt; do
    [ -e "$i" ] || continue
    filename=$(echo "$i" | cut -d- -f1)
    while IFS= read -r aline; do 
      #do something
    done < $i
done

cut命令是一个如何获取文件的第一部分的示例,例如&#34; ORACLETASK1-test.txt&#34;,结果将是&#34; ORACLETASK1&#34;因为参数&#34; -d - &#34;

您可以处理评论所在的每个文件的每一行。那就是你把逻辑放在哪里。

如果它对您来说更简单,您可以分为两部分。一个while循环读取包列表文件和for循环而没有第一个* .txt来读取子文件夹中的文件。