【问题标题】:Using sed to convert camelCase to snake_case AFTER a certain string?在某个字符串之后使用 sed 将 camelCase 转换为 snake_case?
【发布时间】:2020-06-25 18:15:26
【问题描述】:

问题:

我有一堆具有AS myFieldName 别名的.sql 文件。我需要将所有这些都转换为AS my_field_name,而不影响每行第一部分的tbl.myFieldName

例如:

之前:tbl.myFieldName AS myFieldName,

之后:tbl.myFieldName AS my_field_name,

我使用了这个非常简单的答案:https://stackoverflow.com/a/28795550/20178 创建了一个 sed 命令来将 myFieldName 转换为 my_field_name,但它对整行都是如此。

我试过sed 's/*AS ([a-z0-9])([A-Z])/AS \1_\L\2/g'(尽管我知道这对保留行的第一部分不起作用)但它似乎根本不匹配任何东西,因此不会产生任何效果。

如何将AS 添加为匹配模式的一部分,然后匹配所有大写字母以进行替换?

【问题讨论】:

标签: regex sed


【解决方案1】:

这可能对你有用(GNU sed):

sed 's/AS/&\n/;h;s/[[:upper:]]/_\L&/g;H;g;s/\n.*\n//' file

分而治之。使用引入的换行符将行一分为二。制作一个副本,通过插入下划线并在所有此类情况下用小写恭维替换大写字母来修改整个模式空间。将修改后的行附加到其副本中,并删除换行符之间的所有内容。

还有:

sed -E ':a;s/(AS[^[:upper:]]*)([[:upper:]])/\1_\L\2/;ta' file

【讨论】:

    【解决方案2】:

    使用gnu-sed,你可以使用这个:

    s='tbl.myFieldName AS myFieldName,'
    
    sed -E ':a;s/(AS .*)([a-z0-9]+)([A-Z])/\1\2_\L\3/g;ta' <<< "$s"
    
    tbl.myFieldName AS my_field_name,
    

    详情:

    • :a:标记标签a
    • s/(AS .*)([a-z0-9]+)([A-Z])/\1\2_\L\3/g:将驼峰式大小写替换为任何以AS 和空格开头且包含 1 个以上小写字符后跟一个大写字符的字符串的 snak_case。
    • ta:如果s/// 在读取最后一个输入行和最后一个t 命令后成功替换,则分支到标签a

    【讨论】:

    • 感谢您的精彩回答!您能否添加有关该正则表达式字符串中发生了什么神秘魔法的信息?
    • 好的,我现在添加它。
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2017-11-28
    • 2020-02-11
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多