在vim中,我有一行文字:
abcdef
现在我想在每个字母之间添加一个下划线或其他 ,所以这就是结果:
a_b_c_d_e_f
我知道这样做的唯一方法是录制像这样的宏:
qqa_<esc>lq4@q
有更好,更简单的方法吗?
答案 0 :(得分:4)
:%s/\(\p\)\p\@=/\1_/g
:
启动命令。%
搜索整个文档。\(\p\)
将匹配并捕获可打印的符号。例如,如果您只想匹配字符,则可以将\p
替换为\w
。\p\@=
会进行前瞻检查,以确保匹配的(第一个)\p
后跟另一个\p
。第二个,即\p\@=
不构成比赛的一部分。这很重要。\1
填写匹配的(第一个)\p
值,_
是文字。g
是标准的全部标志。答案 1 :(得分:4)
如果您只想在字母之间添加:%s/\a\zs\ze\a/_/g
,可以这样做:
\a
如果您想要多于ASCII字母,请将:help \a
替换为其他模式。
要了解这应该如何运作::help \zs
,:help \ze
,typedef struct node node;
struct node
{
unsigned long long distance;
int edges;
int* edgesL;
node **next;
node *qnext;
int limit;
};
。
答案 2 :(得分:2)
使用正向前瞻和替代:
:%s/\(.\(.\)\@=\)/\1_/g
这将匹配除line break
以外的任何字符后跟的任何字符。
答案 3 :(得分:1)
这是一种快速且更具互动性的方式,所有这一切都在正常模式下。
将光标放在行的开头,按:
i_<Esc>x
插入和删除分隔符。 (我们这样做是为了副作用。)gp
将分隔符放回去。.
,按住它直到工作完成。很遗憾,我们无法在此使用.
计数,因为它只会粘贴分隔符&#39; count&#39;当场时间。
答案 4 :(得分:0)
:%s /../&:/ g
这将在整行的每两个字符之后添加“:”。 前两个期间表示要跳过的字符数。 vim会解释“&”(从我收集的内容中),以识别要添加的字符。 只需在“&”之后指出该字符 “ / g”全局进行更改。 我还没有弄清楚如何排除行的结尾,结果是插入的字符被标记到了结尾……所以像这样:
“ c400ad4db63b”
成为“ c4:00:ad:4d:b6:3b:”