Использование «dd» в Vi (удаление нескольких строк) не допускается, если количество строк > длины файла.

Использование «dd» в Vi (удаление нескольких строк) не допускается, если количество строк > длины файла.

Я часто редактирую файл локально, а затем копирую и вставляю его в удаленный сеанс SSH внутри сеанса vi.

Первый шаг — удалить все содержимое, выполнив следующие действия:

 9999dd

Что удалит до 9999 строк файла.

Теперь каким-то образом версия vi на определенной машине с Ubuntu, работающей под управлением 14.04 LTS, ведет себя по-другому: она не допускает выполнение указанной выше команды, если файл на самом деле не содержит по крайней мере 9999 строк.

Как мне снова включить прежнее /привычное поведение, при котором все строки во всем файле будут стерты, если N (в данном случае 9999) превысит количество строк файла?

ОБНОВЛЯТЬ Я ценю ответы, которые приходят дляальтернативаметоды достижения этого. Однако это не объясняет, почему/как/когда поведение изменилось (я успешно использовал Ndd в течение многих лет. Возможно, это не оптимальный способ. Но он работает - в том числе на Ubuntu - различных версиях, Centos, OS/X).

Еще одно обновление ":" в начале было удалено: мы в обычном режиме. Это ВСЕ ЕЩЕ НЕ РАБОТАЕТ в этом конкретном экземпляре редактора/vi - тогда как это работает, скажем, с 99dd (так как файл содержит > 99 строк), а также выполнение того же действия 9999dd работает в других экземплярах.

решение1

@javadba, попробуй:set nocompatible

Разница между этими двумя типами поведения, по-видимому, зависит от того, находится ли глобальное поведение :set nocompatibleу меня ~/.vimrcили где-либо еще./etc/vim/vimrc

Если я :set nocompatibleтогда я могу использовать :9999вместо того :$, чтобы перейти к концу небольшого файла, и я могу обойтись без таких вещей, как 9999dd. Если у меня естьнет :set nocompatibleзатем ничего не происходит, когда я пытаюсь 9999dd, и я получаю ошибку, E16: Invalid range когда я пытаюсь :9999перейти в конец файла.

решение2

То, что вы пытаетесь сделать (использовать недопустимый диапазон в командном режиме), никогда не работало. Это не работает в 7.2.445 (Debian 6), 7.2.411 (CentOS 6.6), 7.3.429 (Ubuntu 12.04), 7.4.683 (Ubuntu 14.04, PPA).

Думаю, вы перепутали его с 99999dd, который действителен в обычном режиме, поскольку N здесь — это не номер строки, а количество повторений действия — обратите внимание на отсутствие :.

Действительно, в документации об этом говорится следующее:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number

....
The {number} must be between 0 and the number of lines in the file.  When
using a 0 (zero) this is interpreted as a 1 by most commands.  Commands that
use it as a count do use it as a zero (:tag, :pop, etc).  Some commands
interpret the zero as "before the first line" (:read, search pattern, etc).

Если вы хотите удалить все строки и хотите использовать для этого командный режим, то:

:%d

Или, используядиапазоны:

:0,$d

Если вы не хотите использовать командный режим:

ggdG

Ни в том, ни в другом случае не следует использовать странные числа для диапазона.

Связанный контент