使用 While 循环的可读性极强的 Bash 解决方案
您可以使用默认值将文件读入 Bash 循环REPLY多变的。例如:
while read; do
echo "insert into table values ('$(uuidgen)','$REPLY');"
done < /tmp/foo
可读性较差的 Sed 解决方案
sed -e 's/.*/echo "insert into table values (\\"$(uuidgen)\\",\\"&\\");"/e' \
-e "s/\"/'/g" /tmp/foo
while 循环比 sed 替代方案更具可读性,因为需要在替换字符串中转义引号。 sed 解决方案也相当脆弱,因为它是在 sed 表达式内评估文件的内容,当存在某些元字符时,这可能会导致错误。最后,这个特定的 sed 解决方案依赖于/e标志,这是一个GNU sed 扩展 http://www.gnu.org/software/sed/manual/sed.html#index-s-command_002c-option-flags-106这可能在您的平台上不可用。
GNU sed 手册对该标志的描述如下:
该命令允许将 shell 命令的输入通过管道传送到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并用其输出替换模式空间。尾随换行符被抑制;如果要执行的命令包含 null 字符,则结果未定义。这是一个 GNU sed 扩展。
Testing
这两个脚本都经过测试/tmp/foo,其中包含以下夹具数据:
A
B
C
Bash 示例输出:
insert into table values ('fe0ca930-456b-4265-810c-219eb93c4c73','A');
insert into table values ('34b088eb-3dc0-46fa-85ca-efaf3f0c0f4b','B');
insert into table values ('5d271207-99fe-4ca2-8420-3b8ca774e99b','C');
GNU sed 示例输出:
insert into table values ('4c924b78-dc70-441d-928e-638fec9f3ea1','A');
insert into table values ('29f424d4-6e33-4646-a773-cd0e96ebb874','B');
insert into table values ('39534c05-6853-4390-a6b6-4a19fad296b1','C');
结论
Bash 解决方案似乎比 sed 解决方案更清晰、更健壮。然而,这两种解决方案显然都适用于原始问题中提供的夹具数据,因此您应该选择最适合您的实际数据的解决方案。