gpt4 book ai didi

regex - 使用正则表达式有选择地搜索和替换某些行

转载 作者:行者123 更新时间:2023-12-02 02:33:14 25 4
gpt4 key购买 nike

我有一个包含很多SQL语句的文件,例如:

CREATE TABLE "USER" (
"ID" INTEGER PRIMARY KEY,
"NAME" CHARACTER VARYING(50) NOT NULL,
"AGE" INTEGER NOT NULL
);

COPY "USER" (id, name, age) FROM stdin;
1 Skywalker 19
2 Kenobi 57

我希望 COPY 语句中的列名大写并用引号引起来:

COPY "USER" ("ID", "NAME", "AGE") FROM stdin;

使用 sed,我发现了以下正则表达式:

sed -r 's/([( ])(\w+)([,)])/\1"\U\2\E"\3/g'

确实替换了列名,但选择性不够,替换了文件中的其他词:

~/test]$sed -r 's/([( ])(\w+)([,)])/\1"\U\2\E"\3/g' star_wars_example
CREATE TABLE "USER" (
"ID" INTEGER PRIMARY "KEY",
"NAME" CHARACTER VARYING("50")NOT "NULL",
"AGE" INTEGER NOT NULL
);

COPY "USER" ("ID", "NAME", "AGE") FROM stdin;
1 Skywalker 19
2 Kenobi 57

为避免此问题,我希望 sed 仅将正则表达式应用于以 COPY 开头并以 FROM stdin; 结尾的行。

我研究了前瞻/后视,但 sed 不支持它们。它们似乎在 super-sed 中受支持,但我目前正在使用 Cygwin(Windows 在这里是强制性的......)并且它似乎在包列表中不可用。

有没有办法强制 sed 只考虑特定行?

我考虑过在应用 sed 之前通过 grep 管道传输我的文件,但其他行将从输出中消失。

我是否漏掉了一些明显的东西?

如果答案很容易适用于默认的 Cygwin 安装,那就太好了。我想我可以尝试在 cygwin 上安装 super-sed,但我想知道是否有更明显的想法

最佳答案

由于我目前没有可用的 sed,并且从未真正使用过分组,因此此命令可能会或可能不会(根本或按预期)工作 =)

尝试

sed -r '/^COPY /{ s/([( ])(\w+)([,)])/\1"\U\2\E"\3/g }'

如果我对手册的理解正确,这将在以 COPY 开头的任何行上执行替换。

另一种方法是使用分支。这看起来要复杂得多,但更灵活。

关于regex - 使用正则表达式有选择地搜索和替换某些行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2920444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com