更改一行中的特定字符

更改一行中的特定字符

输入

  • 每行由分号分隔成 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 个分号后面的数字后面的空格,所以这种想法让我无处可去,现在我试图在我之前定义的部分中找到空格。

我可以输入awkvim,但话又说回来,我对它还很陌生。我设法找到第六部分并将空格更改为分号,但随后它更改了所有空格,而不仅仅是第一个空格。

:%! awk 'BEGIN{FS=OFS=";"} {gsub(/ /, ";", $6)} 1'

我怎样才能改变第六部分的第一个空格?

答案1

在维姆中:

%s/^\(\([^;]*;\)\{5\}[^ ;]*\)\s/\1;/

意思是:

  • 选择为\1

    • 从该行的开头^
    • 五次\{5\}非分号字符串,后跟分号
    • 在第 6 个字段中加上既不是分号也不是空格的前导字符
  • 后面跟一个空格

  • 替换为所选内容\1和分号。

相关内容