我正在写一个bash
脚本来自动执行SQL
文件的一些更改。我的问题是:我怎样才能使用sed
将CamelCase
文本转换为snake_case
,只有它被包含在反引号中?
例如如下所示的行:
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
轻松转换为小写)但我需要将其范围仅限于反引号中包含的那些部分(即表和列名称),而不保留其他任何内容。我怎样才能达到预期的效果?
没看到反击?
所以,通过这个输入:
INSERT INTO `TableName (ColumnOne, ColumnTwo)` VALUES (120, "YouTube video", "Linux and macOS");
你可以尝试这个sed
sed -E ':A;s/(`.+)([a-z])([A-Z])([^`]+`)/\1\2_\L\3\4/;tA'
使用GNU sed:
sed -E 's/(`[^`]*)([A-Z])([^`]*`)/\L\1\L_\2\3/g' file
如果您不介意使用Perl - 这是一个通用的替代方案 - 可以处理多行文件,多驼峰CamelCase,并将正确忽略字符串("|'
)和SQL语句:
perl -i -p -e 's/(?<!\x22|\x27)([A-Z][a-z0-9]++)(?!\s|,|\))/\L\1_/g; s/(_)+([A-Z])?/\L\1\2/g' file