1

我有几行文字,像这样

text1*textX*,text2

我想将 ** 标记之间的文本移动到行首,所以看起来像这样

textX "text1" "text2"

我怎样才能在命令行中做到这一点?

4

4 回答 4

2

试试下面的命令:

s/^\(.*\)\*\(.*\)\*/\2 \1/

它将 text1*textX*,text2 修改为 textX text1,text2

于 2012-05-19T19:21:08.977 回答
1

如果有文字 * 你需要把它们放在 [*]

:%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 
于 2012-05-19T21:01:36.903 回答
1

另一种方法...

在上面的示例中,我会做(在正常模式下):

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是重复因子。

于 2012-05-21T00:18:30.653 回答
0

虽然 Niraj Nawanit 的回答可能会为您提供所需的内容,但这正是您所要求的:

%s/\([^*]*\)\*\(.*\)\*,\([^[:space:]]*\)/\2 "\1" "\3"/
于 2012-05-19T21:39:38.763 回答