Кто-нибудь знает, можно ли в vi заменить комментариями только раскомментированные / непустые строки?
Если я хочу заменить закомментированную строку чем-то, что я знаю, я могу использовать:% s / ^ # / ## foo ## / g - но я ищу противоположное этому.
Пример файла:
# Some user's cron
# Test comments
00 00 * * * ~/somescript.sh
Ожидаемый результат:
# Some user's cron
# Test comments
##DISABLE##00 00 * * * ~/somescript.sh
:g/^[0-9\*]/s/^/##DISABLED##/
Эта часть «g / RE /» выбирает все строки, которые начинаются с числа или символа *. Затем "s / RE / replace /" выполняет работу на всех выбранных строках.
:%s/^\([^#]\)/##DISABLE##\1/
:%s/^\([#\n]\)\@!/##DISABLE##/g
^ ([# \ n]) \ @! означает "не # или новую строку в начале строки"
У меня работает в vim 7.2
sed -i -e 's/^\([^#]\)/#\1/g' /etc/cronfile
Может быть что-то вроде:
%s/^\([^#]\)\|!\($\)/##FOO##\1/g
Я знаю, что это беспорядок со всеми этими побегами, но первая часть строки не начинается с # [^#]
, ИЛИ (Ускользнувшая труба \|
) непустая строка ( ^$
)
:map q /^[^#]<Enter>0i##DISABLE##<Esc>q
1Gq
Это работает в vim, но не в стандартном vi, который не выполняет хвостовую рекурсию для сопоставлений.
Если вы используете Vim, вас может заинтересовать EnhCommentify.vim плагин, который позволяет легко переключать комментарии.