【问题标题】:Why does this sed regex substitution not work?为什么这个 sed 正则表达式替换不起作用?
【发布时间】: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 来解决问题。

标签: regex linux bash sed


【解决方案1】:

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

【讨论】:

    最近更新 更多