我成功地能够用文件中新生成的 UUIDD 替换 UUID:
FILE=/home/username/sql_inserts_with_uuid.sql
grep -i -o -E "([a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12})" $FILE | xargs -I {} sed -i "s/{}/`uuidgen -t`/g" $FILE
但是速度很慢,因为它会为生成的每个 UUID 重写文件。有没有更有效的方法一次性重写每个 UUID,而不是一遍又一遍地重写同一个文件?
将此示例数据保存在文件中以进行测试:
INSERT INTO fake_table (uuid) VALUES ('812ab76e-43ca-11ec-b54f-00d8617c2296');
INSERT INTO fake_table (uuid) VALUES ('854f7b36-43ca-11ec-9608-00d8617c2296');
INSERT INTO fake_table (uuid) VALUES ('8a09444a-43ca-11ec-8ae2-00d8617c2296');
INSERT INTO fake_table (uuid) VALUES ('8cd0da58-43ca-11ec-9811-00d8617c2296');
INSERT INTO fake_table (uuid) VALUES ('8f9889c0-43ca-11ec-8bfc-00d8617c2296');
最佳答案
您可以将 awk
与系统调用结合使用,一次将它们全部替换:
awk '
BEGIN{pat="[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[0-9][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}"}
function get_uuid(){
cmd = "uuidgen"
cmd | getline uuid
close(cmd)
return uuid
}
$0~pat{
uuid=get_uuid()
sub(pat,uuid,$0)
} 1
' file.txt
打印:
INSERT INTO fake_table (uuid) VALUES ('473C4331-CC31-4FD0-AE99-37FA7E5F23CF');
INSERT INTO fake_table (uuid) VALUES ('EBEC05AB-4236-4384-AF7A-76D4A0615599');
INSERT INTO fake_table (uuid) VALUES ('23740143-6CC1-41FC-8AE7-038810291026');
INSERT INTO fake_table (uuid) VALUES ('7DBF25AF-4E85-4C55-B8CA-0F6150D5DD3C');
INSERT INTO fake_table (uuid) VALUES ('4365127B-EB46-414E-92D4-B48CC211489E');
使用 GNU awk,您可以进行替换 inplace 。否则,您需要将其输出重定向到临时文件,然后在源文件之上 mv
临时文件。这听起来比 actually is 更难.
速度测试:将示例文件乘以 10,000 个 UUID 替换,在我的计算机上处理该文件需要 21 秒,如果同一文件没有替换则需要 26 毫秒。就效率而言,系统调用并不是免费的,但这可能比您正在做的要快......
关于bash - 使用 grep xargs sed 更有效地在文件中生成 UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69944999/