输入
- 每行由分号分隔成 8 个部分
- 每个部分可以包括单词、数字、空格等。
输出
我试图用分号替换第六部分中的空格,从而再次分隔行,使部分总数为 9。
例子
1;30;68;Az LEMda;Ads Awdsâ;1 Bethesda, Galilea, Impe Mkals;29;63
264;16 October 1978;2 April 2005;AAz Jgfg adal II;Madwl Qózca Asdtyła;20 May 1920 Maklo, Polasn;58;84
最终会像
1;30;68;Az LEMda;Ads Awdsâ;1;Bethesda, Galilea, Impe Mkals;29;63
264;16 October 1978;2 April 2005;AAz Jgfg adal II;Madwl Qózca Asdtyła;20;May 1920 Maklo, Polasn;58;84
尝试
我尝试使用从正则表达式到 的任何内容来查找空间,\zs
但失败了。我最接近的是找到第五个分号。
%s/\(.\{-};\zs\)\{5}/;/g
但我需要找到第 5 个分号后面的数字后面的空格,所以这种想法让我无处可去,现在我试图在我之前定义的部分中找到空格。
我可以输入awk
vim,但话又说回来,我对它还很陌生。我设法找到第六部分并将空格更改为分号,但随后它更改了所有空格,而不仅仅是第一个空格。
:%! awk 'BEGIN{FS=OFS=";"} {gsub(/ /, ";", $6)} 1'
我怎样才能改变第六部分的第一个空格?
答案1
在维姆中:
%s/^\(\([^;]*;\)\{5\}[^ ;]*\)\s/\1;/
意思是:
选择为
\1
- 从该行的开头
^
- 五次
\{5\}
非分号字符串,后跟分号 - 在第 6 个字段中加上既不是分号也不是空格的前导字符
- 从该行的开头
后面跟一个空格
替换为所选内容
\1
和分号。