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

问题描述 投票:3回答:3

我正在写一个bash脚本来自动执行SQL文件的一些更改。我的问题是:我怎样才能使用sedCamelCase文本转换为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轻松转换为小写)但我需要将其范围仅限于反引号中包含的那些部分(即表和列名称),而不保留其他任何内容。我怎样才能达到预期的效果?

sql sed
3个回答
1
投票

没看到反击?

所以,通过这个输入:

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'

1
投票

使用GNU sed:

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

1
投票

如果您不介意使用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
© www.soinside.com 2019 - 2024. All rights reserved.