ex - Differences in running vim via command line vs. running it in the vim editor -
i trying process series of files. have noticed there discrepancies in running particular command command line (i.e. ex
mode). e.g.
$cat poo.txt big red dog small black cat $vim -c "2,$g/^dog/d|wq" poo.txt $cat poo.txt big small black cat
it appears 2,$g/^dog/d|wq
has deleted lines red
, dog
. confuses me because command should : start on line 2 (going eof) , delete lines beginning dog
. in instance, i'd expect output be:
$ cat poo.txt big red small black cat
in fact, if try in vim editor exact behavior observed.
question: cause of discrepancy between vim -c
version , vim
version of running command?
i think need replace double quotes single quotes prevent shell expanding $g
. man bash
:
enclosing characters in double quotes preserves literal value of characters within quotes, exception of $, `, \, and, when history expansion enabled, !.
currently, shell expands $g
inside string, if environment variable. it's not defined, expands empty string. so, though you've typed:
vim -c "2,$g/^dog/d|wq" poo.txt
vim doesn't receive command:
2,$g/^dog/d|wq
... but:
2,/^dog/d|wq
this command deletes lines 1 address 2
, next 1 starts dog
(in case it's 3rd line). then, saves , quit.
but if replace quotes, there's still problem in command. :h :bar
:
these commands see '|' argument, , can therefore not followed vim command: ... :global ...
the bar interpreted :g
part of argument, not command termination. in case, means whenever finds line starting dog
, delete it, save , quit. so, if there several dog
lines, first 1 deleted, because :g
have saved , quit after processing 1st one.
you need hide |wq
:g
, either wrapping global command inside string , executing :execute
, or moving wq
in -c {cmd}
. in all, try:
vim -c 'exe "2,\$g/^dog/d" | wq' poo.txt
or
vim -c '2,$g/^dog/d' -c 'wq' poo.txt
or
vim -c '2,$g/^dog/d' -cx poo.txt
Comments
Post a Comment