Linux sed закомментировать все строки

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

Читайте также:  Install linux mail server

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 мы можем двигать курсор как стрелками таки клавишами как на фото внизу.

Перемещение курсора с помощью клавиш h j k l в редакторе vi изображение с сайта www.andreyolegovich.ru

Чтобы переместить курсор в начало строки нажмите

Чтобы переместить курсор в конец строки нажмите

Чтобы переместить курсор в конец файла нажмите

Чтобы переместить курсор в начало файла нажмите

Чтобы переместить курсор на строку номер 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, чтобы вернуться в командный режим.

Читайте также:  Astra linux узнать версию дистрибутива

Кнопками 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:-$> ).

Читайте также:  Cameras ip no linux

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 ‘//s/^#*/#/g’ file (to comment out) and sed -i ‘//s/^#*//g’ file (to uncomment)

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 ‘//s/^#*\s*//g’ file

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.

Источник

Оцените статью
Adblock
detector