我想转换一个文件,例如......
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中,并且没有任何更改。
答案 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