如何使用perl和regex在匹配之间的每个新行的末尾追加字符

时间:2018-01-16 17:25:58

标签: regex bash perl

我正在使用bash perlsed来获取GraphQL查询并将其转换为TypeScript类型。除了一件之外,我已经弄明白了 - 我无法弄清楚如何在正则表达式匹配中的每一行的末尾插入一个逗号。

这是我成功匹配的原始*.graphqls文字:

enum ContentType {
    LESSON
    WARMUP
    QUIZ
    PROJECT
}

进行匹配的正则表达式(选择enum}之间的所有内容:

s/(?s)(?=enum).*?(})

我可以使用bashperl轻松替换整个细分:

ENUM_MATCH="s/(?s)(?=enum).*?(})/replacement/"

perl -i -0pe "${ENUM_MATCH}" "${FULL_PATH}"

但我需要做的是用相同的文本替换这个枚举文本,除了每个枚举行项目上都有逗号 - 最终结果如下所示:

enum ContentType {
    LESSON,
    WARMUP,
    QUIZ,
    PROJECT
}

4 个答案:

答案 0 :(得分:1)

如果允许使用尾随逗号(在airflow scheduler之后),这在C99和C ++ 11中是合法的

PROJECT

使用range operator,并返回它以排除其第一行和最后一行。

答案 1 :(得分:0)

使用逗号逗号:

s{enum[^{]*\{\K([^}]*)}{ $1 =~ s/\n/,\n/gr }seg

s{enum[^{]*\{\K([^}]*)}{ $1 =~ s/\n/,\n/gr =~ s/,(?=[^,]*\z// }seg

答案 2 :(得分:0)

awk one-liner适用于您的示例:

 awk '/enum .*\{/{print;next}p{print p (/\}/?"":",")}{p=$0}END{print p}' file

答案 3 :(得分:0)

,之后允许PROJECT

awk '$1=="}"{f=0} f{$0=$0 ","} $1=="enum"{f=1} 1' data