我正在尝试执行以下操作。我想让用户向我提供一个包含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',
如果你可以摆脱最后一个逗号,可以获得积分。
答案 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'