bash - 使用 grep xargs sed 更有效地在文件中生成 UUID

标签 bash sed grep uuid xargs

我成功地能够用文件中新生成的 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/

相关文章:

bash - Sed 位于特权符号链接(symbolic link)上

linux - 获取最新的匹配字符串值

windows - 如何让 grep 忽略 Windows 换行符?

python - 从终端运行和从 Python 运行时脚本的工作方式不同

mysql - 无法从损坏的 MySQL 转储文件访问表

linux - 在 bash 中对没有 uniq 的列进行排序和计数

bash - 在每一行中搜索一个模式并将其附加到该行的末尾

regex - 下一个单词的 GREP 跟随包含变量的字符串

bash - 如何将数组长度分配给bash中的变量

linux - 将一个变量一个一个地剪切到它的字段