为什么此sed正则表达式替换无效?

时间:2019-08-26 08:01:37

标签: regex linux bash sed

我有一个ID为ID的文件,我想为其创建数据库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');
... 

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您的输入可能有(.*)正在选择的尾随空白。 ([^[:space:]]*)似乎有用。