- Linux sed закомментировать все строки
- Установка Vi
- Основные приёмы
- Вставить строку/строки
- Удалить строку/строки
- Вырезать и вставить строку
- Коротко:
- Подробно:
- Перемещение курсора
- Редактирование файла
- Дописать
- d — Удалить
- Пример редактирования файла
- Поиск по файлу
- sed в vim
- Закомментировать несколько строк сразу
- vim завис
- Проверить версию
- Нумерация строк
- Включить/выключить нумерацию строк
- vimrc
- How to UNCOMMENT a line that contains a specific string using Sed?
- 5 Answers 5
Linux sed закомментировать все строки
Редактор vi или vim много где стоит по умолчанию. Например, в OpenBSD
Многие не любят его, но часто нет выхода. Если Вы занимаетесь тестированием какого-то сервера и нужно залезть в логи — вряд ли Вам разрешать установить что-то своё. А по дефолту может стоять как раз vi.
Так что лучше разобраться с помощью этого руководства и сэкономить своё время.
Полную версию мануала можно изучить здесь
Установка Vi
Советую обновлять vim сразу после установки новой системы. Редактор по умолчанию может быть довольно глючным.
Основные приёмы
vi интуитивно непонятен, поэтому пока Вы не освоили хотя бы несколько команд, работать в нём будет просто невозможно
Я не шучу. Первое, что нужно запомнить: существует несколько режимов работы:
1) Командный режим (Command mode) включается по умолчанию и в нём НЕЛЬЗЯ редактировать текст в привычном понимании. Можно удалять или копировать строки, но написать что-то или удалять по одному символу нельзя.
2) Режим вставки (Insert mode) в нём можно редактировать текст, но сперва туда нужно попасть. Чтобы в него перейти нужно нажать i. Чтобы выйти из него обратно в Command Mode нужно нажать ESC.
Допустим Вы хотите изменить какой-то файл.
Откройте его, нажмите i, внесите изменения, нажмите i ещё раз. Нажмите Esc. Нажмите :. Нажмите w. Нажмите q. Нажмите Enter.
Вставить строку/строки
Вставить предварительно скопированную строку под текущей
Вставить предварительно скопированную строку над текущей
Вставить пустую строку над текущей можно с помощью заглавной O
Вставить пустую строку под текущей
Удалить строку/строки
Удалить строку (после комбинации клавишь может потребоваться нажатие Enter)
Удалить от курсора до конца файла
Перейти в режим редактирования
Вырезать и вставить строку
Коротко:
Подробно:
Предположим в /etc/hosts нужно перенести строку, которая выбивается из общего порядка.
Для этого нужно переместить курсор на эту строку
10.1.102.141 eth1.ru 10.1.102.159 topbicycle.ru 10.1.102.162 test.com 10.1.102. 150 heihei.ru 10.1.102.164 urn.su
10.1.102.141 eth1.ru 10.1.102.159 topbicycle.ru 10.1.102.162 test.com 1 0.1.102.150 heihei.ru 10.1.102.164 urn.su
10.1.102.141 eth1.ru 10.1.102.159 topbicycle.ru 10.1.102.162 test.com 10.1.102.164 urn.su
10.1.102.141 eth1.ru 10.1.102.159 topbicycle.ru 10.1.102.162 test.com 10.1.102.164 urn.su
Переместить курсор на строку после которой нужно вставить вырезанную
10.1.102.141 eth1.ru 10.1.102.159 topbicycle.ru 10.1.102.162 test.com 10.1.102.164 urn.su
10.1.102.141 eth1.ru 10.1.102.150 heihei.ru 10.1.102.159 topbicycle.ru 10.1.102.162 test.com 10.1.102.164 urn.su
Перемещение курсора
Пока Вы НЕ зашли в Insert Mode Вы можете двигать курсор клавишами H — влево, J — вниз, K — вверх, L — вправо.
Таким образом в Command Mode мы можем двигать курсор как стрелками таки клавишами как на фото внизу.
Чтобы переместить курсор в начало строки нажмите
Чтобы переместить курсор в конец строки нажмите
Чтобы переместить курсор в конец файла нажмите
Чтобы переместить курсор в начало файла нажмите
Чтобы переместить курсор на строку номер 10 нажмите
Чтобы переместить курсор в начало строки с табуляцией нажмите
CTRL d подвинет курсор вместе с текстом. В примере курсор сейчас в конце 3-й строки
1 #!/bin/bash 2 mmm 3 mmm 4 mmm 5 mmm
1 #!/bin/bash 2 mmm 3 mmm 4 mmm 5 mmm
Редактирование файла
Отменить последние изменения можно нажав u
Дописать
Рассмотрим файл в котором одна строка 12345 и курсор стоит на 3.
Будем нажимать Esc и ставить курсор на 3 затем одну из клавиш i, a, I, A, затем 0. Потом 0 удаляем.
d — Удалить
Рассмотрим файл со строкой
Поставим курсор на t в слове three
Изменить регистр одного символа можно с помощью ~
Изменить регистр всей строки на противоположный:
Поставить курсор в начало строки и нажать g~~:
Всю строку в верхний регистр:
Скопировать часть файла в другой файл.
Рассмотрим файл greeting
1 Thank you for visiting 2 www.andreyolegovich.ru 3 or one of it’s forks such as: 4 5 eth1.ru — lightweight no JS site 6 devhops.ru — full fork of IT content 7 answerit.ru — API for QA lessons 8 aredel.com — English translation
Скопируем строки 5, 6 и 7 в файл sites
eth1.ru — lightweight no JS site devhops.ru — full fork of IT content answerit.ru — API for QA lessons
Скопировать текст из файла можно с помощью r
touch newsites
vi newsites
:r sites
Пример редактирования файла
Допустим, мы хотим добавить русский язык в Debian Linux .
Мы открываем файл /etc/default/keyboard командой
sudo vi /etc/default/keyboard
Кнопкой j опускаемся на строку
Кнопкой l двигаем курсор на символ s
Нажимаем кнопку a — от слова add — добавить.
Нажимаем ESC, чтобы вернуться в командный режим.
Кнопками h j k l переводим курсор на первую » в строке
vi сделал своё дело, а Вам скорее всего нужно будет перезагрузиться, чтобы язык добавился.
Поиск по файлу
Перейти к следующему результату
Перейти к предыдущему результату
sed в vim
Можно выполнять команды sed прямо в редакторе
Нужно нажать ESC, затем : ввести % и после него команду
Затем нажать ENTER и всё плохое будет заменено на всё хорошее.
Если сразу после выполнения команды нажать u её действие будет отменено.
При выполнении команд с указанием определённых строк % нужен.
Заменить bad на good только в строках 3 и 4 можно командой
Закомментировать несколько строк сразу
С помощью sed комманд можно закомментировать и раскомментировать несколько строк сразу
На примере GNUmakfile для управления VirtualBox
# UBUNTU LINUX_REPO = «mirror.yandex.ru/ubuntu-releases» LINUX_VERSION =20.04.3 # LINUX_ISO=ubuntu-$(LINUX_VERSION)-desktop-amd64.iso LINUX_ISO =ubuntu- $(LINUX_VERSION) -live-server-amd64.iso LINUX_URL =https:// $(LINUX_REPO) / $(LINUX_VERSION) / $(LINUX_ISO) OS_TYPE =Ubuntu_64
Закомментировать строки с 20 по 25 можно нажав ESC и выполнив следующую команду
# UBUNTU # LINUX_REPO=»mirror.yandex.ru/ubuntu-releases» #LINUX_VERSION=20.04.3 ## LINUX_ISO=ubuntu-$(LINUX_VERSION)-desktop-amd64.iso #LINUX_ISO=ubuntu-$(LINUX_VERSION)-live-server-amd64.iso #LINUX_URL=https://$(LINUX_REPO)/$(LINUX_VERSION)/$(LINUX_ISO) #OS_TYPE=Ubuntu_64
Раскомментировать эти строки (20 — 25)
vim завис
Если vim завис попробуйте нажать
Проверить версию
Достаточно просто выполнить команду vi или vim
~ ~ ~ ~ VIM — Vi IMproved ~ ~ version 8.1.3741 ~ by Bram Moolenaar et al. ~ Modified by team+vim@tracker.debian.org ~ Vim is open source and freely distributable ~ ~ Help poor children in Uganda! ~ type :help iccf for information ~ ~ type :q to exit ~ type :help or for on-line help ~ type :help version8 for version info ~ ~ ~
Нумерация строк
Включить/выключить нумерацию строк
1 Thank you for visiting 2 www.andreyolegovich.ru 3 or one of it’s forks such as: 4 5 eth1.ru — lightweight no JS site 6 devhops.ru — full fork of IT content 7 answerit.ru — API for QA lessons 8 aredel.com — English translation
Чтобы сделать изменения постоянными нужно внести их в файл .vimrc
vimrc
Файл с настройками vim обычно можно открыть выполнив
Ещё один вариант — создать файл .vimrc в домашней директории пользователя.
set showmode number nohlsearch set ai ts =4 expandtab abbr _sh #!/bin/bash nmap :set invnumber
устанавливает табуляцию равной 4 пробелам.
позволяет набрав _sh + TAB получить #!/bin/bash
позволяет включать и выключать нумерацию строк нажатием
How to UNCOMMENT a line that contains a specific string using Sed?
Why are you using this technique? The standard technique would be to use one line in the script and make the year number into an argument to the script. You could even default to, say, 2001 if no argument is provided ( $ <1:-2001>), or use an environment variable ( $ ), or both ( $<1:-$> ).1:-2001>
5 Answers 5
Yes, to comment line containing specific string with sed, simply do:
sed -i '/2001/s/^/#/g' file (to comment out) sed -i '/2001/s/^#//g' file (to uncomment)
Option «g» at the end means global change. If you want to change only a single instance of pattern, just skip this.
To avoid commenting multiple times and taking into account multiple leading # , use the following commands: sed -i ‘/
Thanks jnlk and @louis-m. This solution is what worked best for me and accounting for multiple # characters works perfectly.
And if you want to make sure there is no whitespace at the start of line (e. g. in # This is commented out you can use sed -i ‘/
You can tighten the line-matching regex to /^#.* 2001 / , but what you’ve got is strictly within the remit of the question.
To complement @Avinash Raj’s helpful answer with a more generic, POSIX-compliant solution.
- Toggles commenting of lines that match a specifiable string that must occur as a separate word anywhere on the line.
- The comment character (string) is also specifiable.
Note that the solution is awk -based, because a robust portable solution with sed is virtually impossible due to the limitations of POSIX’ basic regular expressions.
awk -v commentId='#' -v word='2001' ' $0 ~ "(^|[[:punct:][:space:]])" word "($|[[:punct:][:space:]])" < if (match($0, "^[[:space:]]*" commentId)) $0 = substr($0, RSTART + RLENGTH) else $0 = commentId $0 > < print >' file > tmpfile.$$ && mv tmpfile.$$ file
- (^|[[:punct:][:space:]]) and ($|[[:punct:][:space:]]) are the POSIX extended regex equivalents of the \ < and \>word-boundary assertions known from other regex dialects.
- Whitespace after the comment char is preserved, but not before it.
- When prepending the comment char to a line, it is directly prepended, without whitespace.
- Thus, if you only toggle comments with this solution, all whitespace is preserved.
- POSIX awk doesn’t offer in-place updating (neither does POSIX sed , incidentally), hence the output is first captured in a temporary file and that file then replaces the original on success.