【发布时间】:2019-08-26 08:01:37
【问题描述】:
我有一个带有 id 的文件,我想为其创建 db INSERT。
我要使用的 SQL:INSERT INTO docstore.migratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), 'id_from_file', now(), 'HERC-742');
我将sed 与正则表达式一起使用,但替换似乎弄乱了结果。
带有 id 的文件:
$ cat object_ids_01.sql
09ab41308002760e
09ab41308002760f
09ab413080027610
09ab413080027611
...
当我运行这个命令时:$ sed -E "s/(.*)/INSERT INTO docstore.migratie_dms \(id, document_id, creatiedatum, gebruiker\) VALUES \(uuid_generate_v4\(\), \'\1\', now\(\), \'HERC-742\'\);/" object_ids_01.sql > output.sql
我得到了这些结果:
$ cat output.sql
', now(), 'HERC-742');igratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), '09ab41308002760e
', now(), 'HERC-742');igratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), '09ab41308002760f
', now(), 'HERC-742');igratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), '09ab413080027610
', now(), 'HERC-742');igratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), '09ab413080027611
...
\1 似乎有问题,因为当我用常量字符串替换它时,我得到了不错的 INSERT:
$ sed -E "s/(.*)/INSERT INTO docstore.migratie_dms \(id, document_id, creatiedatum, gebruiker\) VALUES \(uuid_generate_v4\(\), \'xxxxxx\', now\(\), \'HERC-742\'\);/" object_ids_01.sql > output.sql
$ cat output.sql
INSERT INTO docstore.migratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), 'xxxxxx', now(), 'HERC-742');
INSERT INTO docstore.migratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), 'xxxxxx', now(), 'HERC-742');
INSERT INTO docstore.migratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), 'xxxxxx', now(), 'HERC-742');
INSERT INTO docstore.migratie_dms (id, document_id, creatiedatum, gebruiker) VALUES (uuid_generate_v4(), 'xxxxxx', now(), 'HERC-742');
...
我做错了什么?
【问题讨论】:
-
(.*)可能比您想象的要多。看到这些看起来本质上是字母数字,如果你用(\w+)替换呢? -
您的输入可能有
(.*)正在挑选的尾随空格。([^[:space:]]*)似乎有效。 -
@automaton:是的,这就行了。谢谢。
-
@npinti:你在正确的轨道上,但你的解决方案没有这样做,因为我在文件中有一些带有破折号的 UUID。
-
@Koohoolinn:在这种情况下,
[A-Za-z0-9_-]也可以代替\w来解决问题。