预挂起并附加到shell变量

时间:2015-05-06 09:30:55

标签: bash shell unix

我的目标是将外部表日志文件加载到oracle数据库的CLOB列中。我一直遇到你可以立即插入的最大大小的问题,但我能够插入整个文件,如果我to_clob日志文件的每一行,连接然后插入它们(据我知道这似乎是最快最简单的方法吗?):

 insert into clob_insert_test values (to_clob('hfsdjhfjsdhfjksd')||chr(10)||to_clob('jhfklsdjfklsdjklfjdsjlk'));

我的问题是: 我正在将文件读入shell变量,如下所示,我需要做的是将 to_clob(')预先挂起到变量的每一行的开头,然后追加')| | chr(10)|| 并从变量中删除最后的 || chr(10)|| 以完成。然后我可以在clob列的SQL插入语句中使用该变量。有没有一种方法可以直接在变量上执行此操作,而不是在读取之前修改日志文件?

log_content=$(<"$log_file")

编辑:

抱歉,我不认为我很清楚。给定示例日志文件,我期望以下变量内容。

输入文件:

LOG file opened at 05/05/15 15:12:24

Field Definitions for table ext_loading
Record format DELIMITED BY NEWLINE

可变内容:

to_clob('LOG file opened at 05/05/15 15:12:24')||char(10)||to_clob('Field Definitions for table ext_loading')||char(10)||to_clob('Record format DELIMITED BY NEWLINE')

1 个答案:

答案 0 :(得分:2)

我假设您有一个类似的文件:

this is me||chr(10)||adfasdf
asdas||chr(10)||asdfasdfasdas

你希望它变得像:

to_clob('this is meadfasdf')||chr(10)||
to_clob('asdasasdfasdfasdas')||chr(10)||

如果是这样,您可以像这样使用sed

sed -e "s/||chr(10)||//" -e "s/^/to_clob('/" -e "s/$/')||chr(10)||/" file

那是:

  • 从每行删除||chr(10)||一次。
  • to_clob('添加到每行的开头。
  • ')||chr(10)||添加到每行的末尾。

并将其存储在变量中:

log_content=$(sed -e "s/||chr(10)||//" -e "s/^/to_clob('/" -e "s/$/')||chr(10)||/" "$log_file")

更新

要匹配真正所需的内容,您也可以这样做:

line=$(sed -e "/./s/^/to_clob('/" -e "/./s/$/')||chr(10)||/" "$log_file")

然后输出是:

$ echo $line  # note, without quotes to have all of it together!
to_clob('LOG file opened at 05/05/15 15:12:24')||chr(10)|| to_clob('Field Definitions for table ext_loading')||chr(10)|| to_clob('Record format DELIMITED BY NEWLINE')||chr(10)||

并删除最后一个||chr(10)||

$ echo $line | sed 's/||chr(10)||$//'
to_clob('LOG file opened at 05/05/15 15:12:24')||chr(10)|| to_clob('Field Definitions for table ext_loading')||chr(10)|| to_clob('Record format DELIMITED BY NEWLINE')