Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql sed:更改包含在反勾号中的文本的大小写_Sql_Sed - Fatal编程技术网

Sql sed:更改包含在反勾号中的文本的大小写

Sql sed:更改包含在反勾号中的文本的大小写,sql,sed,Sql,Sed,我正在编写一个bash脚本来自动对SQL文件执行一些更改。我的问题是:如何使用sed将CamelCase文本转换为snake\u-case文本,仅在其包含在backticks中的情况下 e、 g.一条类似以下的线: INSERT INTO TableName (ColumnOne, ColumnTwo) VALUES (120, "YouTube video", "Linux and macOS"); 应成为: INSERT INTO table_name (column_one, colum

我正在编写一个
bash
脚本来自动对
SQL
文件执行一些更改。我的问题是:如何使用
sed
CamelCase
文本转换为
snake\u-case
文本,仅在其包含在backticks中的情况下

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的/`[^`]*`/\L\0/g”filename.sql
)轻松转换为小写,但我需要将其范围仅限于包含在反勾号内的部分(即表名和列名),而不涉及任何其他内容。如何实现预期结果?

使用GNU时:

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

如果您不介意使用Perl,这里是一个通用的替代方案,它可以处理多行文件、多峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼峰驼

perl -i -p -e 's/(?<!\x22|\x27)([A-Z][a-z0-9]++)(?!\s|,|\))/\L\1_/g; s/(_)+([A-Z])?/\L\1\2/g' file

perl-i-p-e的/(?没有看到背景标记吗

因此,有了这个输入:

INSERT INTO `TableName (ColumnOne, ColumnTwo)` VALUES (120, "YouTube video", "Linux and macOS");
你可以试试这个

sed -E ':A;s/(`.+)([a-z])([A-Z])([^`]+`)/\1\2_\L\3\4/;tA'

谢谢,这非常有帮助!为了完成我的工作,我简单地将[a-z]改为[a-z0-9],并将[a-z]改为[a-z0-9],以匹配数字字符。现在它完全按照预期工作。