使用sed将模板文件中的文本替换为包含引号的变量

时间:2011-06-23 19:18:15

标签: bash sed

我正在尝试执行以下操作。我想让用户向我提供一个包含ID列表的文件。它看起来像这样:

41aeb908-dfc7-4cf8-8285-31ca184dc1c5
da877ffa-49bc-4f07-b692-4873870fcb37
a555cdd0-e100-42cb-a355-140de7958b36

该文件中可能有10或100行。它会有所不同。然后我想使用SQLPlus将它们提供给SQL查询。为了做到这一点,我需要在每个行周围加上引号,并在每行后添加逗号。

echo "Formatting XIDs for query..."
formattedtxs=`sed -e "s/^/'/g" -e "s/$/'/g" -e "s/$/,/g" $1`

$ 1将具有要处理的文件名。然后我有一个文件,我将把这些。

select distinct tt.transaction_id||','||tt.entity_id||','||cm.user_id
from transaction_tracker tt, course_membership cm
tt.entity_id = cm.course_id and
tt.transaction_id IN (XXXXXXXX);

我的想法是将那些XXXX作为我的模板放在那里,找到并用我的文本替换它。

echo "Substituting XIDs into query template..."
sed "s/XXXXXXXX/$formattedtxs/" < query.template >query.tmp

它不起作用,因为它给出了错误未终止的's'命令。我猜这是因为我的formattedtxs变量本身有单引号。有任何想法吗?第一个sed命令的结果是这个

'41aeb908-dfc7-4cf8-8285-31ca184dc1c5', 'da877ffa-49bc-4f07-b692-4873870fcb37', 'a555cdd0-e100-42cb-a355-140de7958b36', '2b7794f5-9811-4cf3-bd42-1d459d8cb6eb', '6133179e-4e4c-4917-a132-1ee03ab88465', '81343735-e943-4084-ab9f-86f8b5aedfa9',

如果你可以摆脱最后一个逗号,可以获得积分。

4 个答案:

答案 0 :(得分:3)

假设你没有和sed结婚并且可以使用简单的bash脚本,你可以这样做:

cat $1 | while read line; do echo -n "'$line',"; done | sed 's/,$//'; echo

其中$ 1是要读取的文件。

答案 1 :(得分:2)

将此保存到文件“mksql.bash”左右......

sed "s/REPLACEME/$(sed "s/.*/'&'/" | paste -s -d, -)/" < template_file.txt

并使用它:

bash mksql.bash < your_id_file

将产生

select distinct tt.transaction_id||','||tt.entity_id||','||cm.user_id
from transaction_tracker tt, course_membership cm
tt.entity_id = cm.course_id and
tt.transaction_id IN ('41aeb908-dfc7-4cf8-8285-31ca184dc1c5','da877ffa-49bc-4f07-b692-4873870fcb37','a555cdd0-e100-42cb-a355-140de7958b36');

“template_file.txt”包含你的sql模板:

select distinct tt.transaction_id||','||tt.entity_id||','||cm.user_id
from transaction_tracker tt, course_membership cm
tt.entity_id = cm.course_id and
tt.transaction_id IN (REPLACEME);

我用“REPLACEME”替换了很多XX..X,因为我懒得数Xes

顺便说一句,欢迎来到......:)

答案 2 :(得分:0)

您可以使用一个sed命令轻松完成:

sed -e '1i\
        select distinct tt.transaction_id||','||tt.entity_id||','||cm.user_id\
        from transaction_tracker tt, course_membership cm\
        tt.entity_id = cm.course_id and\
        tt.transaction_id IN (' \
    -e "s/.*/'&',/" \
    -e "\$a\
       'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')" > query.tmp

带有大量x的条目显然不是有效的GUID(UUID?),因此不会匹配,但会中和最后一个有效GUID上的尾随逗号。

如果您希望材料来自模板文件,则可以使用“-e "1r $template_file"”代替insert命令。您可以使用“-e "\$r $trailing_file"”将尾随材料添加到最后。等

这里的大部分技巧是处理引用与SQL引用交互的shell。很难,但非常重要的是,要跟踪哪个流程可以看到什么。

答案 3 :(得分:0)

Pure Bash:

declare -a a=( $( cat $1 ) )    # IDs into an array
result="${a[*]}"                # array to string, blank as separator
result=\'${result// /\', \'}\'  # substitute blanks with ', ' / add first, last '

echo -e "${result}"

这给出了:

'41aeb908-dfc7-4cf8-8285-31ca184dc1c5', 'da877ffa-49bc-4f07-b692-4873870fcb37', 'a555cdd0-e100-42cb-a355-140de7958b36'