交换行中的 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
我有以下一行:
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