使用sed或等效命令将新uuid添加到文件的每一行

时间:2012-06-23 06:44:05

标签: shell sed uuid

我有一个多行文本文件,我想用它来创建一个需要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

3 个答案:

答案 0 :(得分:3)

使用While循环的非常易读的Bash解决方案

您可以使用默认的 REPLY 变量将文件读入Bash循环。例如:

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 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);