如何使用sed的vim替换命令?

时间:2013-12-06 23:38:45

标签: regex vim sed

我想转换一个文件,例如......

X,Y,id,
7.6245541,51.9556144,4064462
7.6248384,51.9556227,4064462
7.6250697,51.9556376,4064462

...使用正则表达式进入以下格式。

X,Y,id,
"lat" : 7.6245541, "lon" : 51.9556144,
"lat" : 7.6248384, "lon" : 51.9556227,
"lat" : 7.6250697, "lon" : 51.9556376,
"lat" : 7.6256435, "lon" : 51.9557072,

以下替换命令在vim中完美无缺:

:%s#\(\d*\.\d*\)\(,\)\(\d*\.\d*\)\(,\)\(\d*\)$#"lat" : \1\2 "lo" : \3\4#g

我如何使用 sed 来做同样的事情?如果我可以使用扩展表达式模式(sed参数-r以避免转义圆括号),我会很高兴。这是我试过的:

sed -r 's#(\d*\.\d*)(,)(\d*\.\d*)(,)(\d*)$#"lat" : \1\2 "lo" : \3\4#gw output.csv' input.csv

原始内容将打印到shell中,并且没有任何更改。

4 个答案:

答案 0 :(得分:4)

由于报价问题,请避免使用#;这是一个较短的解决方案:

sed -i 's/^\([0-9.]*\),\([0-9.]*\),.*/ "lat" : \1, "lon" : \2,/g' filename.csv 

-i表示将文件转换到位。

你可能也会为第一行做些什么。为此,请在第一个X之前添加0,在第二个Y之前添加0

答案 1 :(得分:2)

您可以使用awk代替sed

awk -F, '/^[0-9]/ {$0="\"lat\" : "$1", \"lon\" : "$2","}1' file
X,Y,id,
"lat" : 7.6245541, "lon" : 51.9556144,
"lat" : 7.6248384, "lon" : 51.9556227,
"lat" : 7.6250697, "lon" : 51.9556376,

这提供了一个易于阅读/理解的解决方案。使用反向引用和复杂的正则表达式使得很难看到正在发生的事情。

答案 2 :(得分:2)

这个怎么样:

sed 's#^\([0-9]\+.[0-9]\+\),\([0-9]\+.[0-9]\+\).*# "lat" : \1, "lon" : \2,#g' input.csv 

答案 3 :(得分:1)

你可以使用这样的表达式:

sed -r 's/([0-9.]+),([0-9.]+),[0-9]+/"lat" : \1, "lon" : \2,/' data > output.txt

如果数据是包含原始数据的文件,并且>将输出重定向到output.txt'. \1\2会被第一组和第二组内容扩展正则表达式。

您也可以使用-i选项直接执行此操作。

sed -i -r 's/([0-9.]+),([0-9.]+),[0-9]+/"lat" : \1, "lon" : \2,/' data