我已经得到了我想要用它来创建需要一个UUID的SQL语句多行文本文件。 我试图想出一个方法来生成使用SED或其他一些shell命令实用的SQL。
Example input:
A
B
C
Example Output:
insert into table values ('7CC92727-D743-45E0-BE57-9FEB2B73BD18','A');
insert into table values ('94E03071-F457-48DD-86E2-AF26309A192D','B');
insert into table values ('1F17525C-9215-4FC4-A608-4FA43C0B2B14','C');
我可以使用的uuidgen命令生成新的UUID的,但到目前为止还没有找到一种方法,使用该命令与SED。
更新:多亏了我能想出为我工作在Cygwin上一个sed命令的答案。
表示无报价为didatic目的SQL值:
sed 's/.*/echo "insert into table values (`uuidgen | tr -d \r`,&)"/e' file.txt
随着行情:
sed 's/.*/echo "insert into table values '\''(`uuidgen | tr -d \r`'\'','\''&'\'')"/e' file.txt
一个非常可读的猛砸解决方案使用while循环
您可以读取该文件到使用默认REPLY变量猛砸循环。 例如:
while read; do
echo "insert into table values ('$(uuidgen)','$REPLY');"
done < /tmp/foo
一个不太可读的桑达解决方案
sed -e 's/.*/echo "insert into table values (\\"$(uuidgen)\\",\\"&\\");"/e' \
-e "s/\"/'/g" /tmp/foo
while循环是显著比SED替代更具可读性,因为有必要逃避你替换字符串引号。 战略经济对话的解决方案是因为事实上,它正在评估SED的表情,当某些元字符都存在这可能会导致错误中的文件,内容也相当脆弱。 最后,这个特殊的SED解决方案依赖于/ E标志,这是一个GNU sed的扩展 ,可能无法在您的平台上。
在GNU sed的手册描述了标志如下所示:
该命令允许一个从外壳命令管输入到图案空间。 如果一个取代制成,执行了在图案空间中找到的命令和模式空间被替换为它的输出。 甲换行符被抑制; 结果是不确定的,如果要执行的命令包含一个NUL字符。 这是一个GNU sed的扩展。
测试
这两个脚本被针对的/ tmp / foo,它包含在下夹具数据进行测试:
A
B
C
巴什样本输出:
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的解决方案更清晰,更稳健。 然而,这两种解决方案,显然在原来的问题提供的灯具数据,所以你应该选择哪一个最适合你的真实数据。
sed 's/.*/echo "`uuidgen`,&"/e' input |
sed -r 's/(.*),(.*)/insert into table values("\1","\2");/' |
tr '"' "'"
insert into table values('c609f5ab-28ce-4853-bd67-7b6b4ca13ee3','A');
insert into table values('01ae6480-1b52-49a8-99a3-f2bba7ec3064','B');
insert into table values('a41122e8-5e4f-4acc-b62a-bc4ad629677e','C');
这可能会为你工作:
echo -e 'a\nb\nc' |
sed 's/.*/uuidgen;echo "&"/' |
sh |
sed 'N;s/^\(.*\)\n\(.*\)/insert into table values('\''\1'\'',\2);/'
insert into table values('c9939dfe-5a74-465a-b538-66aeba774b6b',a);
insert into table values('da6684f2-3426-4561-b41d-7b507d2d79ee',b);
insert into table values('23c72ef5-2a50-4a09-b964-83eea3c54e83',c);
或使用GNU sed的:
echo -e 'a\nb\nc' |
sed 'h;s/.*/uuidgen/e;G;s/^\(.*\)\n\(.*\)/insert into table values('\''\1'\'',\2);/'
insert into table values('ac1a130c-50a3-43ce-8d41-987ca0d942b7',a);
insert into table values('59426b2f-cf03-4233-bcc2-3ce05c47bece',b);
insert into table values('fdec75d6-313e-48c4-adfb-335721a0f6e7',c);