You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用Sed/Regexp将双引号内的制表符替换为空格

解决Sed替换双引号内制表符的问题

问题场景

原始文本(\t代表制表符):

1 \t 2 \t 3 \t "4 \t 5 \t 6" \t 7

需要将双引号内的制表符替换为空格,保留引号外的制表符,期望输出:

1 \t 2 \t 3 \t "4 5 6" \t 7

原命令的问题

你之前使用的命令:

sed '/\s/s/".*"/"  "/' 1.txt

存在两个核心问题:

  1. .*是贪婪匹配,会匹配从第一个双引号到该行最后一个双引号之间的所有内容,而非单个引号对内部的内容
  2. 直接将引号内的全部内容替换为固定空格,完全丢失了原有文本

正确的Sed解决方案

使用带循环的Sed命令,精准处理引号内的制表符:

sed -E ':loop s/("[^"]*)\t([^"]*")/\1 \2/; t loop' 1.txt

命令解释

  • -E:启用扩展正则表达式,简化括号的转义
  • :loop:定义循环标签,用于重复处理直到引号内无制表符
  • s/("[^"]*)\t([^"]*")/\1 \2/:匹配引号内的单个制表符,将其替换为空格。其中[^"]*确保只匹配引号内的内容,不会跨引号
  • t loop:如果上一次替换成功,跳回loop标签继续处理,直到引号内所有制表符都被替换

备选方案:用Awk更简洁处理

如果环境允许,Awk的字段分隔特性更适合这类场景:

awk -F'"' '{for(i=2;i<=NF;i+=2) gsub(/\t/," ",$i)} 1' OFS='"' 1.txt

命令解释

  • -F'"':以双引号作为字段分隔符,此时偶数字段为引号内的内容,奇数字段为引号外的内容
  • for(i=2;i<=NF;i+=2):遍历所有引号内的字段(偶数位)
  • gsub(/\t/," ",$i):将当前字段内的所有制表符替换为空格
  • OFS='"':设置输出分隔符为双引号,确保输出格式正确
  • 1:默认打印处理后的每一行

内容的提问来源于stack exchange,提问作者Sakthi Lingam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:27:29