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

2024-01-09

我有一个多行文本文件,我想用它来创建需要 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 中使用该命令的方法。

Update:感谢这些答案,我能够想出一个在 cygwin 上对我有用的 sed 命令。

表达时不出于说教目的而引用 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 循环的可读性极强的 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 解决方案更清晰、更健壮。然而,这两种解决方案显然都适用于原始问题中提供的夹具数据,因此您应该选择最适合您的实际数据的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐