我正在编写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
轻松转换为小写)但我需要将其范围仅限于反引号中包含的那些部分(即表和列名称),留下任何内容别的没有动过。我怎样才能达到预期的效果?
答案 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");