求助:使用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
存在两个核心问题:
.*是贪婪匹配,会匹配从第一个双引号到该行最后一个双引号之间的所有内容,而非单个引号对内部的内容- 直接将引号内的全部内容替换为固定空格,完全丢失了原有文本
正确的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
相关产品推荐
相关产品推荐

