我有几行文字,像这样
text1*textX*,text2
我想将 ** 标记之间的文本移动到行首,所以看起来像这样
textX "text1" "text2"
我怎样才能在命令行中做到这一点?
我有几行文字,像这样
text1*textX*,text2
我想将 ** 标记之间的文本移动到行首,所以看起来像这样
textX "text1" "text2"
我怎样才能在命令行中做到这一点?
试试下面的命令:
s/^\(.*\)\*\(.*\)\*/\2 \1/
它将 text1*textX*,text2 修改为 textX text1,text2
如果有文字 * 你需要把它们放在 [*]
:%s,\v^([^ ]*)\s\+([^ ]*).*,\2 \1,g
: ................. command
% ................. whole file
s ................. replace
^ ................. begining of line
, ................. search and replace delimiter (comma exchanging by bar)
\v ................ very magic, see :h very-magic
([^ ]*) ........... group 1 (group here) everything except space
\s\+ .............. one or more spaces
([^ ]*) ........... group 2 (group here) everything except space
\s\+ .............. one or more spaces
.* ................ zero or more characters
\2 ................. back reference to group 2
\1 ................. back reference to group 1
, .................. ending replace
g .................. global
另一种方法...
在上面的示例中,我会做(在正常模式下):
0dt*f*p
. 0 : goes to start of line
. d : starts delete (waits for movement or text object)
. t* : moves the cursor to the first asterisk and yanks the deleted text to the unnamed register
. f* : moves the cursor to the second asterisk
. p : pastes the contents of the unnamed register immediately after the second asterisk
参考:
:h f
:h t
当然,在你能够想象出这两个命令的强大功能并使其成为第二天性之前,确实需要一些练习,因此你可以在现实世界的情况下使用它们。
有时我发现这种方法比在 Vim 的命令行上输入正则表达式更有效。
不止几行:
qzq:@=n
其中n是重复因子。
虽然 Niraj Nawanit 的回答可能会为您提供所需的内容,但这正是您所要求的:
%s/\([^*]*\)\*\(.*\)\*,\([^[:space:]]*\)/\2 "\1" "\3"/