Rating@Mail.ru
IPB
Etersoft - from Windows to Linux
Etersoft
решения для перехода
с Windows на Linux
Дружественные сайты: alv.me и Rus-Linux.net

Здравствуйте, гость ( Вход | Регистрация ) Поиск · 

> Перед задачей вопроса

поищите ответ в хендбуке - http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/

 
Reply to this topic Start new topic
> Особенности BSD-шного sed
mirlas
bookmark
gfbbdvkmrlj
Nov 3 2009, в 19:21
Сообщение #1


Постоялец
Иконка группы

Сообщений: 158

Вставить имя   :   Цитата

ОС: Gentoo; Mandriva; FreeBSD
Город: Москва

Группа: Участники

Автор темы
Чувствую себя дураком и никак не могу прикинуть: как в FreeBSD sed'ом найти строку в файле и добавить под эту строку новую строку с данными?
Go to the top of the page
 
+Quote Post
skeletor
bookmark
gfbbdvkmrlj
Nov 4 2009, в 14:36
Сообщение #2


Диффурщик
Иконка группы

Сообщений: 1224

Вставить имя   :   Цитата

ОС: FreeBSD
Город: Киев

Группа: Участники

После строки test2 вставить qqq. Текст находится в file.name
Код
sed '/test2/ a \qqq' file.name


--------------------
"Винда съела дрова и резет здесь не фурычит"
"Все говорят, что у меня /dev/hands кривой и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!"
Go to the top of the page
 
+Quote Post
mirlas
bookmark
gfbbdvkmrlj
Nov 4 2009, в 20:11
Сообщение #3


Постоялец
Иконка группы

Сообщений: 158

Вставить имя   :   Цитата

ОС: Gentoo; Mandriva; FreeBSD
Город: Москва

Группа: Участники

Автор темы
Цитата(skeletor @ Nov 4 2009, в 14:36) *
После строки test2 вставить qqq. Текст находится в file.name
Код
sed '/test2/ a \qqq' file.name

Спасибо за ответ, но я неспроста написал тему в FreeBSD. По умолчанию тут используется НЕ GNU версия седа и конструкцию, что Вы написали в FreeBSD не выполняется. Пока решил просто - поставил из портов gsed - в нем как раз так работает...
Go to the top of the page
 
+Quote Post
diesel
bookmark
gfbbdvkmrlj
Nov 4 2009, в 21:17
Сообщение #4



Иконка группы

Сообщений: 5989

Вставить имя   :   Цитата

ОС: OS X, openSuSE, ROSA, Debian
Город: Одесса, Украина

Группа: Модераторы разделов

Цитата(mirlas @ Nov 4 2009, в 19:11) *
Цитата(skeletor @ Nov 4 2009, в 14:36) *
После строки test2 вставить qqq. Текст находится в file.name
Код
sed '/test2/ a \qqq' file.name

Спасибо за ответ, но я неспроста написал тему в FreeBSD. По умолчанию тут используется НЕ GNU версия седа и конструкцию, что Вы написали в FreeBSD не выполняется. Пока решил просто - поставил из портов gsed - в нем как раз так работает...

в конце концов можно не вставить, а заменить....

Код
diesel@indie:~$ sed '/^test2$/s/\(^.*$\)/\1\
qqq/' file
test1
test2
qqq
test3
diesel@indie:~$ cat file
test1
test2
test3



PS.

Код
diesel@indie:~$ sed '/^test2$/a\
qqq\
' file
test1
test2
qqq
test3
Go to the top of the page
 
+Quote Post
mirlas
bookmark
gfbbdvkmrlj
Nov 4 2009, в 21:51
Сообщение #5


Постоялец
Иконка группы

Сообщений: 158

Вставить имя   :   Цитата

ОС: Gentoo; Mandriva; FreeBSD
Город: Москва

Группа: Участники

Автор темы
Цитата(diesel @ Nov 4 2009, в 21:17) *
Цитата(mirlas @ Nov 4 2009, в 19:11) *
Цитата(skeletor @ Nov 4 2009, в 14:36) *
После строки test2 вставить qqq. Текст находится в file.name
Код
sed '/test2/ a \qqq' file.name

Спасибо за ответ, но я неспроста написал тему в FreeBSD. По умолчанию тут используется НЕ GNU версия седа и конструкцию, что Вы написали в FreeBSD не выполняется. Пока решил просто - поставил из портов gsed - в нем как раз так работает...

в конце концов можно не вставить, а заменить....

Код
diesel@indie:~$ sed '/^test2$/s/\(^.*$\)/\1\
qqq/' file
test1
test2
qqq
test3
diesel@indie:~$ cat file
test1
test2
test3



PS.

Код
diesel@indie:~$ sed '/^test2$/a\
qqq\
' file
test1
test2
qqq
test3



В первом случае нужно еще \ в конце добавить, что бы эранировать newline, а то ругается. Но этот способ хорош только при однократном запуске, в скрипте такое малоприменимо sad.gif А если эти команды выполнять удаленно (по хорошему, мне надо выполнять это передавая через ssh), то с такой реаализацией, мне кажется не сделать вообще (с newline)... Может можно еще чем-то сделать вставку строки?
Go to the top of the page
 
+Quote Post
diesel
bookmark
gfbbdvkmrlj
Nov 4 2009, в 21:59
Сообщение #6



Иконка группы

Сообщений: 5989

Вставить имя   :   Цитата

ОС: OS X, openSuSE, ROSA, Debian
Город: Одесса, Украина

Группа: Модераторы разделов

ну можно так
Код
awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file
Go to the top of the page
 
+Quote Post
mirlas
bookmark
gfbbdvkmrlj
Nov 4 2009, в 22:20
Сообщение #7


Постоялец
Иконка группы

Сообщений: 158

Вставить имя   :   Цитата

ОС: Gentoo; Mandriva; FreeBSD
Город: Москва

Группа: Участники

Автор темы
Цитата(diesel @ Nov 4 2009, в 21:59) *
ну можно так
Код
awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file

хм...:
/test2/: Event not found.
Go to the top of the page
 
+Quote Post
diesel
bookmark
gfbbdvkmrlj
Nov 5 2009, в 02:21
Сообщение #8



Иконка группы

Сообщений: 5989

Вставить имя   :   Цитата

ОС: OS X, openSuSE, ROSA, Debian
Город: Одесса, Украина

Группа: Модераторы разделов

Цитата(mirlas @ Nov 4 2009, в 21:20) *
Цитата(diesel @ Nov 4 2009, в 21:59) *
ну можно так
Код
awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file

хм...:
/test2/: Event not found.

вы где-то с кавычками напутали(оболочка bash?)
Go to the top of the page
 
+Quote Post
mirlas
bookmark
gfbbdvkmrlj
Nov 5 2009, в 11:59
Сообщение #9


Постоялец
Иконка группы

Сообщений: 158

Вставить имя   :   Цитата

ОС: Gentoo; Mandriva; FreeBSD
Город: Москва

Группа: Участники

Автор темы
Цитата(diesel @ Nov 5 2009, в 02:21) *
Цитата(mirlas @ Nov 4 2009, в 21:20) *
Цитата(diesel @ Nov 4 2009, в 21:59) *
ну можно так
Код
awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file

хм...:
/test2/: Event not found.

вы где-то с кавычками напутали(оболочка bash?)

Хм.. Да в bash работает, а оболочка по умолчанию - csh - в ней не работает.. хм..
Go to the top of the page
 
+Quote Post
skeletor
bookmark
gfbbdvkmrlj
Nov 5 2009, в 13:18
Сообщение #10


Диффурщик
Иконка группы

Сообщений: 1224

Вставить имя   :   Цитата

ОС: FreeBSD
Город: Киев

Группа: Участники

Если не работает, то нужно сделать переписать скрипт так:
Код
sed '/test2/ a \
\qqq'
file.name

то есть перенос строки


--------------------
"Винда съела дрова и резет здесь не фурычит"
"Все говорят, что у меня /dev/hands кривой и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!"
Go to the top of the page
 
+Quote Post
freezl
bookmark
gfbbdvkmrlj
May 3 2016, в 10:40
Сообщение #11


Прохожий
Иконка группы

Сообщений: 2

Вставить имя   :   Цитата
Город: СПб

Группа: Участники

Требуется помощь знающих людей - предложенный скрипт не взлетел sad.gif А очень надо!!! Задача та же - вставить определённую строку после строки с определённым ключевым словом. Система - pfsense. Поставить gsed не получилось (с ним всё проще было бы)
Создал файл test.txt с содержимым
Код
#cat test.txt
a
b
c
d

написал скрипт по аналогии
Код
sed '/b/ a \
\qqq'
test.txt

При запуске выдаёт новую строку и как будто ждёт ещё какого то ввода - помогает только CTRL+C
Задача стоит управлять правилами фаервола на pfsense удалённо с другой машины по ssh в обход web. Управление простейшее - включать/выключать по запросу 2 правила.
На удалённой машине Linux и gnu sed - уже появляются мысли тянуть файл с правилами на линуксовую машину, править его там и вертать в зад. Но это бред imho.

Эта конструкция, кстати, отрабатывает норм
Код
#sed '/b$/s/\(^.*$\)/\1\\
qqq/' file

Вот только мне надо из скрипта! А как сделать, ума не приложу - второй день бьюсь.
Go to the top of the page
 
+Quote Post
Bizdelnick
bookmark
gfbbdvkmrlj
May 3 2016, в 10:52
Сообщение #12


grammatikführer
Иконка группы

Сообщений: 13118

Вставить имя   :   Цитата

ОС: Debian GNU/Linux
Город: Санкт-Петербург

Группа: Модераторы разделов

sed '/b/a\
qqq' test.txt


--------------------
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик


Спасибо сказали:
Go to the top of the page
 
+Quote Post
freezl
bookmark
gfbbdvkmrlj
May 3 2016, в 12:09
Сообщение #13


Прохожий
Иконка группы

Сообщений: 2

Вставить имя   :   Цитата
Город: СПб

Группа: Участники

Цитата(Bizdelnick @ May 3 2016, в 10:52) *
sed '/b/a\
qqq' test.txt

Почти идеал! Только после qqq надо перенос строки вставить
Код
a
b
qqqd
e

Как это в скриптах делается?

Всё допёр!
Код
#!/bin/sh
b='qqq\
'
sed '/b/a\
\'"${b}" test.txt
Go to the top of the page
 
+Quote Post
generatornikov
bookmark
gfbbdvkmrlj
Jan 11 2018, в 14:58
Сообщение #14


Прохожий
Иконка группы

Сообщений: 1

Вставить имя   :   Цитата

ОС: FreeBSD

Группа: Участники

Да простят меня за некропостинг, но эта тема полностью соответствует моей задаче.
Но возник вопрос:
После выполнения
Код
awk '/marker/{print $0"\nText"}; !/This/{print $0}'cfg.test

терминал вывел мне исправленную версию этого файла. Но как сразу записывать изменения в исходный файл? Т.е. просматривать промежуточный этап мне не нужно вообще (код выполняется внутри скрипта).
И еще, подскажите, как вставлять не после строки, а до?

Последний вопрос: я правильно, что таким образом (код выше) ищутся все строки с данным вхождением (marker), а не конкретно это слово? - т.е. даже если marker находится в середине строки, то вставка произойдет перед строкой, а не перед словом marker?

Спасибо.
Go to the top of the page
 
+Quote Post
Bizdelnick
bookmark
gfbbdvkmrlj
Jan 11 2018, в 15:38
Сообщение #15


grammatikführer
Иконка группы

Сообщений: 13118

Вставить имя   :   Цитата

ОС: Debian GNU/Linux
Город: Санкт-Петербург

Группа: Модераторы разделов

Цитата(generatornikov @ 11th January 2018 - в 14:58) *
как сразу записывать изменения в исходный файл?

Записываете во временный файл, потом заменяете им исходный.

Цитата(generatornikov @ 11th January 2018 - в 14:58) *
как вставлять не после строки, а до?

Вместо
Код
/marker/{print $0"\nText"};
сделайте
Код
/marker/{print "Text\n"$0};


Цитата(generatornikov @ 11th January 2018 - в 14:58) *
я правильно, что таким образом (код выше) ищутся все строки с данным вхождением (marker), а не конкретно это слово? - т.е. даже если marker находится в середине строки, то вставка произойдет перед строкой, а не перед словом marker?

Ищется строка, совпадающая с регулярным выражением. Именно она и оказывается в переменной $0.


--------------------
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Go to the top of the page
 
+Quote Post

 Reply to this topic Start new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 23rd January 2018 - в 13:02




Rating@Mail.ru