2014-11-25 47 views
0

我开始写我的第一个大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,我需要生成(在一个循环)一系列SQL文件的F或在ORACLETASK1-run.conf文件中的每一行,将是这样的:

QUESTION UNRELATED SET AND CLEAR COMMANDS GO HERE 

VARIABLE RC REFCURSOR; 

和最重要的行云HERE

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

文件的其余部分

SPOOL SOME_FILE_NAME_I_DONT_KNOW_HOW_TO_NAME_IT_YET.TXT 
PRINT RC; 
SPOOL OFF 
EXIT; 

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

+1

线索:阅读文件http://en.kioskea.net/faq/1757-how-to-read-a-file-line-by-line并操纵流中的行http://rute.2038bug.com /node11.html.gz并将输出连接到一个文件中https://www.mkssoftware.com/docs/man1/cat.1.asp – 2014-11-25 11:37:54

回答

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 
0

所以,你需要阅读的文件了您的脚本是和子文件夹命名的配置。

你需要做的是这样

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命令,是如何得到“ORACLETASK1-的test.txt”文件的第一部分的示例中,结果将是“ORACLETASK1”因为参数“-d-”

您可以在评论所在的每个文件的每一行上工作。这就是你放置逻辑的地方。

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

相关问题