Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: sed. Закомментировать все строки после N.  (Прочитано 2052 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн oS_a

  • Автор темы
  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
Приветствую.
Помогите решить: требуется закомментировать все строки после указанной; если строка уже закомментирована то пропускать её и идти дальше.
Первое условие решается sed 'N,$s/^/#/' file Каким образом реализовать второе, т.е. пропускать уже закоменченые строки?

shamanhuev

  • Гость
Re: sed. Закомментировать все строки после N.
« Ответ #1 : 29 Ноября 2021, 16:54:32 »
т.е. пропускать уже закоменченые строки?
А великий смысл ? Они всё равно останутся закоменчеными.

Оффлайн Domitory

  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #2 : 29 Ноября 2021, 17:48:13 »
Каким образом реализовать второе, т.е. пропускать уже закоменченые строки?

самое просто что приходит в голову это не пропускать повторное закоменчивание строк а просто вычистить лишние знаки решетки после.

sed -i 's/##/#/' file.txt     --заменить каждое первое "##" в каждой строке файла на "#"



Ну или касаемо вашего случая наверное так надо

sed 'N,$s/##/#/' file


Пользователь добавил сообщение 29 Ноября 2021, 18:01:00:
А великий смысл ? Они всё равно останутся закоменчеными.

Чтобы в следующий раз когда их все придется раскомментировать не забыть и не споткнуться об эти лишние символы, актуально например когда файлы администрирует несколько человек. Ну или просто для красоты если это просто длинный текстовый текстовый файл.
« Последнее редактирование: 29 Ноября 2021, 18:06:33 от Domitory »

Оффлайн oS_a

  • Автор темы
  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #3 : 29 Ноября 2021, 18:13:47 »
Великого смысла нет. У самурая нет цели.
На самом деле вопрос эстетики во вторую очередь. В первую же очередь решить задачу которая сегодня носит эстетический характер, а завтра, возможно, совершенно кардинально поменяет свое значение.
sed 'N,$s/##/#/' file да, спасибо, это оно. Но тут больше вопрос можно ли оба условия выполнить одной командой.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6662
  • 20% Cooler
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #4 : 29 Ноября 2021, 18:30:52 »
Цитировать
sed 'N,$s/^/#/' file
sed: -e expression #1, char 2: extra characters after command
:o

sed '/N/,$ s/^#*/#/' file
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Domitory

  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #5 : 29 Ноября 2021, 18:44:37 »
Но тут больше вопрос можно ли оба условия выполнить одной командой.

можно вот так что бы не набедокурить с файлом
sed   -e '1,$ s/^/#/'  -e '1,$ s/##/#/'  file.txt  > 123 


или вот так чтобы сразу все записать в исходный файл

sed  -i -e '1,$ s/^/#/'  -e '1,$ s/##/#/'  file.txt  > 123

Пользователь добавил сообщение 29 Ноября 2021, 18:50:34:
N,$s

" N,$ "  это диапазон в котором надо провести операцию, вместо "N" подставить номер строки а "$" означает последнею строку.
После "$" пробел ещё, он почему то упускается если копировать и  вставлять текст тут на форуме.

Пользователь добавил сообщение 29 Ноября 2021, 18:56:28:
sed '/N/,$ s/^#*/#/' file
Что то не очень понято что должно произойти. Выполняется но файл вроде и не меняется.
« Последнее редактирование: 29 Ноября 2021, 18:56:28 от Domitory »

Оффлайн oS_a

  • Автор темы
  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #6 : 29 Ноября 2021, 18:59:32 »
$ echo -e "string1\nstring2\nstring3\nstring4" | sed '3,$s/^/#/'
string1
string2
#string3
#string4

$ sed '/2/,$ s/^#*/#/' file
string1
#string2
#string3
#string4
Все ок, спасибо!

И вопрос. Почему тут не работает?
$ sed '/2/,$ s/^#*/#/' 1.sh
asd
asd
asd
asd
asd
asd
asd
asd
a
sd

Domitory, и вам спасибо. Ушел вкуривать.

Оффлайн Domitory

  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #7 : 29 Ноября 2021, 19:09:46 »
Ушел вкуривать.

Чтобы легче было вкуривать поделюсь своей памяткой по SED
Буквально только вчера накропал её на коленке.

#Немного о потоковом редактор SED. Несколько примеров.

Редактор SED применяется для редактирования файлов при помощи скриптов


sed -n '1,100p  linux.txt > 100.txt     --вывести строки с 1 по 100 из файла linux.txt в файл  100.txt

sed -n -e '1,50p' -e '1000,1100p' linux.txt  > 123.txt     --вывести строки с 1 по 50 и с 1000 по 1100 из файла linux.txt в файл  100.txt

sed -n '112~10p' linux.txt > 112.txt     --вывести каждую 10-ю строчку начиная с 112 строки в 112.txt

sed -n '/^#/p' linux.txt    --вывести все строки начинающиеся с "#"
sed -n '/^# /p' linux.txt  --вывести все строки начинающиеся с "# "


sed -i 's/OS/linux/' file.txt     --заменить каждое первое слово "OS" в каждой строке файла file.txt и заменить на слово "linux"
sed -i 's/OS/linux/g' file.txt    --заменить каждое слово "OS" файла file.txt и заменить на слово "linux". Оперант "g" в конце шаблона включает глобальный поиск
sed -i 's/OS/linux/gI' file.txt   --оперант "I" включает не чувствительность к регистру. Слово "OS", "os", "Os" и "oS" будут заменены на на слово "linux".

sed -i 's|/etc/fstab|/linux/linux|g' linux.txt     --чтобы заменить /etc/fstab на /linux/linux  нужно использовать разделитель "|" вместо "/"


sed -i '100 s/linux/OS/' linux.txt       --заменить слово "linux" на слово "OS" в строке номер 100
sed -i '100-200 s/linux/OS/' linux.txt   --заменить слово "linux" на слово "OS" в диапазоне строк

sed -i '/linux/a новая строка с текстом после найденного слова linux' linux.txt     --добавления новой строки после каждого найденного совпадения
sed -i '/linux/i новая строка с текстом перед найденным словом linux' linux.txt     --добавления новой строки перед каждым совпадением


sed -i.bak 's|/etc/fstab|/linux/linux|g' linux.txt     --при выполнении команды sed будет создан резервный файл исходного с добавлением расширения bak

sed '/^00000/ i дополнительная строка'g linux.txt > 11111.txt     --добавить строчку "дополнительная строка" после каждой строки начинающейся с "00000" и сохранить результат в файл 11111.txt

sed -i '$ a new line' linux.txt             --добавить строку "new line" конец файла
sed -i '3 a new line' linux.txt             --добавить строку "new line" после третьей строки
sed '3,5 r file.txt' linux.txt              --добавить содержимое файла file.txt в файл linux.txt после 3 и 5 строк

sed -i '0,/LINUX/ i /111111111/' linux.txt     --добавить строчку "1111111111" перед первой строчкой содержащей слово "LINUX"
sed -i '0,/LINUX/ a /111111111/' linux.txt     --добавить строчку "1111111111" после первой строчки содержащей слово "LINUX"


Оперант -i вносит изменения непосредственно в исходный файл, если его не указывать то нужно задать вывод в новый файл с помощью ">"


sed -i 10d linux.txt           --удаление 10-ой строки в файле linux.txt
sed -i $d linux.txt            --удалить последнею строку в файле
sed -i '10-30d' linux.txt      --удаление диапазона строк
sed -i '10-30!d' linux.txt     --удалить все строки кроме диапазона. Оперант "!" задает отрицание (инвентирование)
sed -i "10,$d" linux.txt       --удалить строки с 10-ой до последней включительно
sed -i '/qwerty/d' linux.txt   --удалить строки содержащие определенной слово
sed '/^$/d' linux.txt          --удалить пустые строки
sed -i '0,/LINUX/{/LINUX/d;}' linux.txt     --удаление только первой найденной строки содержащей слово "LINUX"
sed -i '2,/LINUX/{/LINUX/d;}' linux.txt     --удаление только второй найденной строки содержащей слово "LINUX"


sed -i G linux.txt               --добавить  пустые строчки после каждой не пустой
sed -i '10,$ s/^/#/' linux.txt    --закомментировать все строки начиная с 10-й строки

sed -i -e 's/linux/LINUX/gI' -e 's/Window/door/gI' linux.txt     --выполнение сразу двух команд в одной строке. Оперант "-e" начинает выполнение второй команды

[code]
« Последнее редактирование: 29 Ноября 2021, 19:13:05 от Domitory »

Оффлайн oS_a

  • Автор темы
  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #8 : 29 Ноября 2021, 19:24:14 »
Огромное спасибо!

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6662
  • 20% Cooler
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #9 : 29 Ноября 2021, 19:27:24 »
Что то не очень понято что должно произойти. Выполняется но файл вроде и не меняется.
выполняется в терминал. Сам файл не меняется. Ключик -i нужен, чтобы перезаписать файл

Почему тут не работает?
Там двойки нет

sed '/ТУТ ПИШЕМ СТРОКУ С СОВПАДЕНИЕМ/,$ s/^#*/#/' 1.sh
$ sed '/2/,$ s/^#*/#/' file
string1
#string2
#string3
#string4



🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн oS_a

  • Автор темы
  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
Re: sed. Закомментировать все строки после N.
« Ответ #10 : 29 Ноября 2021, 19:31:47 »
Там двойки нет
Похоже, хватит sed'a на сегодня. Спасибо!

 

Страница сгенерирована за 0.03 секунд. Запросов: 22.