新的UUID添加到SED采用或等效的命令文件中的每一行(Add new uuid to each l

2019-07-30 01:56发布

我已经得到了我想要用它来创建需要一个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

Answer 1:

一个非常可读的猛砸解决方案使用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的解决方案更清晰,更稳健。 然而,这两种解决方案,显然在原来的问题提供的灯具数据,所以你应该选择哪一个最适合你的真实数据。



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


Answer 3:

这可能会为你工作:

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


文章来源: Add new uuid to each line of a file using sed or equivalent command
标签: shell sed uuid