sed:更改反引号中包含的文本大小写

时间:2017-12-17 05:21:07

标签: sql sed

我正在编写bash脚本以自动对SQL文件执行某些更改。我的问题是:我如何使用sed仅将CamelCase文本转换为snake_case仅包含在反引号中的内容?

e.g。如下所示的行:

INSERT INTO TableName (ColumnOne, ColumnTwo) VALUES (120, "YouTube video", "Linux and macOS");

应该成为:

INSERT INTO table_name (column_one, column_two) VALUES (120, "YouTube video", "Linux and macOS");

以下表达式

sed -i -r 's/([a-z0-9])([A-Z])/\1_\L\2/g' filename.sql

执行所需作业的第一部分(文本最终可以使用sed -i 's/`[^`]*`/\L\0/g' filename.sql轻松转换为小写)但我需要将其范围仅限于反引号中包含的那些部分(即表和列名称),留下任何内容别的没有动过。我怎样才能达到预期的效果?

3 个答案:

答案 0 :(得分:1)

使用GNU sed:

 sed -E 's/(`[^`]*)([A-Z])([^`]*`)/\L\1\L_\2\3/g' file

答案 1 :(得分:1)

如果您不介意使用Perl - 这是一个通用替代方案 - 可以处理多行文件,多驼峰CamelCase,并且会正确忽略字符串({{1和} SQL语句:

"|'

答案 2 :(得分:1)

没有看到反击?

所以,通过这个输入:

bcrypt$

你可以试试这个sed

INSERT INTO `TableName (ColumnOne, ColumnTwo)` VALUES (120, "YouTube video", "Linux and macOS");