交换行中的 1 和 0

Swap 1 and 0 in the line

我有以下一行: 0110101010

需要将1转0,0转1,即得到: 1001010101

有什么方法可以用 vim 做到这一点吗?

只使用一个临时变量如何:

:s/0/x/g | s/1/0/g | s/x/1/g

|允许按顺序执行多个命令(参见:help :command-bar)。

所以我们首先将 0 更改为 x(这样我们就不会以第二个全零结束 命令),然后将 1 更改为 0,最后更改 x(这是 以前 0) 到 1.

如何利用常用的命令行工具?

:.!tr 10 01

还是纯粹的程序化方法?

:call getline('.')->tr('01','10')->setline('.')

参见 :help getline():help setline():help tr():help :!

您可以使用匹配在替换语句中对其应用一些逻辑

:s/\v(0|1)/\=submatch(0)==0?1:0/g

分解为

\v(0|1)                   search for either a 0 or 1
\=submatch(0)==0?1:0      if match equals 0 replace with 1, otherwise with 0

寻找 :h \=:h submatch 以获得更多帮助。

编辑 cudo 到 BEn C

或者,使用一些巧妙的算法来缩短命令

:s/\v(0|1)/\=1-submatch(0)/g