我输入以下架构
10,0,'string1_string2,_string3','',8,0,0,0.59,'20140101205216','20140128074836',584266915,5934
并且我想,
使用sed将所有逗号“ ”替换为制表符。约束是不要,
在文本字符串内替换“ ”(即,逗号'string1_string2,_string3'
不应用tab替换)。要执行此操作的正则表达式是,(?!,_)。
但是,以下sed不起作用。我也尝试了所有转义的排列。
sed s/",\(\?\!,_\)"/"\t"/g
有没有办法做到这一点?
在Mac OS X 10.9.1上,可以使用:
sed -E -e "s/('[^']*'|[^,]*),/\1X/g"
除了用实际选项卡替换X。对于您的输入行,将产生:
10X0X'string1_string2,_string3'X''X8X0X0X0.59X'20140101205216'X'20140128074836'X584266915X5934
您要在其中使用X的标签。使用GNU sed
,您可以-r
代替使用-E
(尽管它也可以识别-E
)。Macsed
不会扩展\t
到选项卡;GNUsed
会的。使用Bash,您可以使用ANSI-C报价机制将外壳程序嵌入到传递给字符串的选项卡中sed
:
sed -E -e "s/('[^']*'|[^,]*),/\1"$'\t'"/g"
如果没有扩展的正则表达式(由-r
或激活-E
),则不值得尝试sed
;使用awk
代替。
正则表达式会寻找任何一个单引号后跟零个或多个非引号和单引号或零个或多个非逗号,后跟一个逗号,以怎样被人记住的要么/或字符串和“选项卡取代它'(使用X表示制表符,因为它更可见)。
devnull 指出,以上答案替换了行尾字符串中的逗号。有一个解决方法:
sed -E -e "s/('[^']*'|[^,]*)(,|$)/\1"$'\t'"/g; s/"$'\t'"$//"
的s///g
分号之前添加到每一行的端部的卡口; 在s///
分号之后删除刚刚添加的标签。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句