使用Vim

bvuwiixz  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(101)

我有一个文件,其中有100行数据,格式如下:

Smith, [email protected], 271Ave 
    Doe, [email protected], 270Ave  
    .
    .

字符串

我想把所有的条目都改成下面的格式:

{"name": "Smith", "email": "[email protected]", "Address:" "271Ave"}


请建议如何在Vim中实现这一点。

68bkxrlz

68bkxrlz1#

如果每行都有相同的文本格式,用Vim来做很容易。在vim中打开文件,假设你的光标在第1行,然后在寄存器q中记录宏:

qqI{"name": "<esc>f,i"<esc>wi"email": "<esc>;i"<esc>wi"Address:" "<esc>A"}<esc>+q

字符串
然后重放宏200次(如果超过200行,可以给给予999)

200@q


你也可以使用嵌套宏,这样你就不必输入200

lndjwyie

lndjwyie2#

@肯特已经回答了问题。“
下面是如何使用awk来完成它,如果有人喜欢使用awk:

awk -F, 'function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s } function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s } {print "{\"name\": \""$1"\", \"email\": \""ltrim($2)"\", \"Address\": \""rtrim(ltrim($3))"\"}"}' < tmp

字符串
易于阅读:

awk -F, '
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
{
print "{\"name\": \""$1"\", \"email\": \""ltrim($2)"\", \"Address\": \""rtrim(ltrim($3))"\"}"
}
' < tmp


copy paste命令并将tmp替换为您的文件名。

zed5wv10

zed5wv103#

就这么办:

:%s/\([^, ]\+\), \([^, ]\+\), \([^, ]\+\)/{"name": "\1", "email": "\2", "Address
": "\3"}

字符串
\([^, ]\+\)将不包含,或空格``的任何字符分组。

相关问题