带有双引号和SED的环绕数字

时间:2013-10-03 13:15:16

标签: regex bash unix sed

我有一个简单的要求,我输入了像

4,23139,,"XYZ" 

在文本文件中,我需要像

这样的输出
"4","23139","","ARCMsgEnum".

我写的命令在某些情况下运行正常:

sed 's/[0-9]*[0-9]/"&"/g' inputTestData.txt | sed s/,,/,\"\",/g 

但有些行的输入为timestamp:

4,23139,,"XYZ","2008-09-04 08:11:33.51 AM"

所以期望的输出是:

"4","23139","","XYZ","2008-09-04 08:11:33.51 AM"

但上面的命令给出了输出:

"4","23139","","XYZ",""2008"-"09"-"04" "08":"11":"33"."46" AM"

3 个答案:

答案 0 :(得分:3)

以下内容可能适合您:

sed -e 's/"//g' -e 's/[^,]*/"&"/g' inputfile

这将首先删除引号,然后在逗号内的部分中插入引号。

举个例子:

$ echo 4,23139,,\"XYZ\",\"2008-09-04 08:11:33.51 AM\" | sed -e 's/"//g' -e 's/[^,]*/"&"/g'
"4","23139","","XYZ","2008-09-04 08:11:33.51 AM"

答案 1 :(得分:1)

因为我无法想到一种聪明的健壮方式,你可以使用:

$ sed -re 's/^[^"]/"&/' 
       -e 's/[^"]$/&"/' 
       -e 's/,,/,"",/g' 
       -e 's/([^"]),/\1",/g' 
       -e 's/,([^"])/,"\1/g' file

答案 2 :(得分:0)

这应该对你有用

sed -re 's/([0-9]+),/"\1",/g' -e 's/,,/,"",/g' inputTestData.txt

你非常接近。只需检查,

后面的数字

例如:

$ cat inputTestData.txt
4,23139,,"XYZ","2008-09-04 08:11:33.51 AM"

$ sed -re 's/([0-9]+),/"\1",/g' -e 's/,,/,"",/g' inputTestData.txt
"4","23139","","XYZ","2008-09-04 08:11:33.51 AM"

注意

对于多个正则表达式,您无需将一个sed输出管道传输到另一个sed。您可以多次使用-e选项后跟s/../../g