如何移除文件中外层双引号并合并多行空行?修正sed命令问题
问题:移除SQL语句外层双引号并合并连续空行
需要实现两个需求:
- 仅移除每个SQL语句块的外层双引号,保留语句内部的双引号
- 将文件中的多个连续空行合并为一行
输入示例
"UPDATE TableA SET country_code = "FR", WHERE name = "A"; " "UPDATE TableA SET name = "A's B" WHERE country_code = "FR"; "
期望输出
UPDATE TableA SET country_code = "FR", WHERE name = "A"; UPDATE TableA SET name = "A's B" WHERE country_code = "FR";
问题分析
之前尝试的sed -e 's/^"\|"$//g' test.sql > test_output.sql会误删语句内部的双引号,因为该命令会匹配所有行首或行尾的双引号,没有区分外层包裹的双引号和语句内部的双引号。实际上外层双引号的特征是:要么是单独占一行的",要么是SQL块第一行开头的"。
解决方案
方案一:使用awk一次性完成
awk适合处理多行文本逻辑,可同时处理外层双引号和空行合并:
awk ' # 跳过单独一行的外层双引号 /^"$/ { next } # 移除SQL块开头的外层双引号 /^"/ { sub(/^"/, ""); print; next } # 合并连续空行:仅保留一行空行 NF == 0 { if (!empty_flag) { print; empty_flag=1 }; next } # 正常输出非空行,并重置空行标记 { empty_flag=0; print } ' test.sql > test_output.sql
方案二:分两步用sed处理
先清理外层双引号,再合并连续空行:
- 清理外层双引号:
sed -e '/^"$/d' -e 's/^"//' test.sql > temp.sql
- 合并连续空行:
sed '/^$/N;/^\n$/D' temp.sql > test_output.sql
说明
- 两种方案都会精准保留SQL语句内部的双引号,仅移除包裹整个SQL块的外层双引号
- 连续空行会被合并为单一空行,保证输出格式整洁
内容的提问来源于stack exchange,提问作者Elaine
相关产品推荐
相关产品推荐

