使用 grep xargs sed 更有效地在文件中生成 UUID
Use grep xargs sed to regenerate UUIDs in a file more effeciently
我成功地用文件中新生成的 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
}
[=10=]~pat{
uuid=get_uuid()
sub(pat,uuid,[=10=])
} 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. Otherwise, you need to redirect the output of this to a temp file then mv
the temp file on top of the source file. This sounds harder than is 。
速度测试:将您的示例文件乘以 10,000 个 UUID 替换,文件在我的计算机上处理时间为 21 秒,如果同一文件没有替换则为 26 毫秒。系统调用在效率方面不是免费的,但这可能比你正在做的更快...
简而言之bash:
猫new_uuids
#!/bin/bash
hex='[[:xdigit:]]'
hex3="$hex$hex$hex"
hex4="$hex3$hex"
hex8="$hex4$hex4"
hex12="$hex8$hex4"
pat="$hex8-$hex4-[0-9]$hex3-[89aAbB]$hex3-$hex12"
while IFS= read -r line; do
if [[ $line = *$pat* ]]; then
echo "${line/$pat/$(uuidgen -t)}"
else
echo "$line"
fi
done
称其为
./new_uuids < sql_inserts_with_uuid.sql > new_sql_inserts_with_uuid.sql
我成功地用文件中新生成的 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
}
[=10=]~pat{
uuid=get_uuid()
sub(pat,uuid,[=10=])
} 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. Otherwise, you need to redirect the output of this to a temp file then mv
the temp file on top of the source file. This sounds harder than is
速度测试:将您的示例文件乘以 10,000 个 UUID 替换,文件在我的计算机上处理时间为 21 秒,如果同一文件没有替换则为 26 毫秒。系统调用在效率方面不是免费的,但这可能比你正在做的更快...
简而言之bash:
猫new_uuids
#!/bin/bash
hex='[[:xdigit:]]'
hex3="$hex$hex$hex"
hex4="$hex3$hex"
hex8="$hex4$hex4"
hex12="$hex8$hex4"
pat="$hex8-$hex4-[0-9]$hex3-[89aAbB]$hex3-$hex12"
while IFS= read -r line; do
if [[ $line = *$pat* ]]; then
echo "${line/$pat/$(uuidgen -t)}"
else
echo "$line"
fi
done
称其为
./new_uuids < sql_inserts_with_uuid.sql > new_sql_inserts_with_uuid.sql