我有一个多行文本文件,我想用它来创建一个需要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
答案 0 :(得分:3)
您可以使用默认的 REPLY 变量将文件读入Bash循环。例如:
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表达式中文件的内容,这可能会在存在某些元字符时导致错误。最后,这个特殊的sed解决方案依赖于 / e 标志,这是GNU sed extension,可能在您的平台上不可用。
GNU sed手册描述了如下标志:
此命令允许将shell命令的输入传输到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并将模式空间替换为其输出。尾随换行被抑制;如果要执行的命令包含空字符,则结果未定义。这是一个GNU sed扩展。
这两个脚本都针对 / 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解决方案更清晰,更强大。但是,两个解决方案都清楚地处理原始问题中提供的夹具数据,因此您应该选择最适合您的实际数据。
答案 1 :(得分:2)
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');
答案 2 :(得分:1)
这可能对您有用:
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);