我认为您需要用单引号替换双引号以防止您的外壳扩展$g
。来自man bash
:
Enclosing characters in double quotes preserves the literal value of all
characters within the quotes, with the exception of $, `, \, and,
when history expansion is enabled, !.
目前,您的 shell$g
在您的字符串中扩展,就好像它是一个环境变量一样。但它可能没有定义,因此扩展为一个空字符串。因此,即使您输入了:
vim -c "2,$g/^dog/d|wq" poo.txt
Vim 没有收到命令:
2,$g/^dog/d|wq
... 但:
2,/^dog/d|wq
此命令删除从地址为 的行2
到以 开头的下一dog
行(在您的情况下为第 3 行)的所有行。然后,它保存并退出。
但是即使您替换引号,您的命令仍然存在问题。来自:h :bar
:
These commands see the '|' as their argument, and can therefore not be
followed by another Vim command:
...
:global
...
条被解释:g
为其参数的一部分,而不是命令终止。在您的情况下,这意味着每当它找到以 开头的行时dog
,它将删除它,然后立即保存并退出。所以,如果有几dog
行,只有第一行会被删除,因为:g
在处理第一行后会保存并退出。
您需要通过将全局命令包装在一个字符串中并使用 执行它|wq
,或者通过移入另一个. 总而言之,您可以尝试::g
:execute
wq
-c {cmd}
vim -c 'exe "2,\$g/^dog/d" | wq' poo.txt
或者
vim -c '2,$g/^dog/d' -c 'wq' poo.txt
或者
vim -c '2,$g/^dog/d' -cx poo.txt