Особенности BSD-шного sed

FreeBSD, NetBSD, OpenBSD, DragonFly и т. д.

Модератор: arachnid

Ответить
Аватара пользователя
mirlas
Сообщения: 158
ОС: Gentoo; Mandriva; FreeBSD

Особенности BSD-шного sed

Сообщение mirlas »

Чувствую себя дураком и никак не могу прикинуть: как в FreeBSD sed'ом найти строку в файле и добавить под эту строку новую строку с данными?
Спасибо сказали:
Аватара пользователя
skeletor
Сообщения: 1224

Re: Особенности BSD-шного sed

Сообщение skeletor »

После строки test2 вставить qqq. Текст находится в file.name

Код: Выделить всё

sed '/test2/ a \qqq' file.name
Спасибо сказали:
Аватара пользователя
mirlas
Сообщения: 158
ОС: Gentoo; Mandriva; FreeBSD

Re: Особенности BSD-шного sed

Сообщение mirlas »

skeletor писал(а):
04.11.2009 14:36
После строки test2 вставить qqq. Текст находится в file.name

Код: Выделить всё

sed '/test2/ a \qqq' file.name

Спасибо за ответ, но я неспроста написал тему в FreeBSD. По умолчанию тут используется НЕ GNU версия седа и конструкцию, что Вы написали в FreeBSD не выполняется. Пока решил просто - поставил из портов gsed - в нем как раз так работает...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Особенности BSD-шного sed

Сообщение diesel »

mirlas писал(а):
04.11.2009 20:11
skeletor писал(а):
04.11.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
Спасибо сказали:
Аватара пользователя
mirlas
Сообщения: 158
ОС: Gentoo; Mandriva; FreeBSD

Re: Особенности BSD-шного sed

Сообщение mirlas »

diesel писал(а):
04.11.2009 21:17
mirlas писал(а):
04.11.2009 20:11
skeletor писал(а):
04.11.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, а то ругается. Но этот способ хорош только при однократном запуске, в скрипте такое малоприменимо :( А если эти команды выполнять удаленно (по хорошему, мне надо выполнять это передавая через ssh), то с такой реаализацией, мне кажется не сделать вообще (с newline)... Может можно еще чем-то сделать вставку строки?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Особенности BSD-шного sed

Сообщение diesel »

ну можно так

Код: Выделить всё

awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file
Спасибо сказали:
Аватара пользователя
mirlas
Сообщения: 158
ОС: Gentoo; Mandriva; FreeBSD

Re: Особенности BSD-шного sed

Сообщение mirlas »

diesel писал(а):
04.11.2009 21:59
ну можно так

Код: Выделить всё

awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file

хм...:
/test2/: Event not found.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Особенности BSD-шного sed

Сообщение diesel »

mirlas писал(а):
04.11.2009 22:20
diesel писал(а):
04.11.2009 21:59
ну можно так

Код: Выделить всё

awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file

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

вы где-то с кавычками напутали(оболочка bash?)
Спасибо сказали:
Аватара пользователя
mirlas
Сообщения: 158
ОС: Gentoo; Mandriva; FreeBSD

Re: Особенности BSD-шного sed

Сообщение mirlas »

diesel писал(а):
05.11.2009 02:21
mirlas писал(а):
04.11.2009 22:20
diesel писал(а):
04.11.2009 21:59
ну можно так

Код: Выделить всё

awk '/test2/{print $0"\nqqq"};   !/test2/{print $0}' file

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

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

Хм.. Да в bash работает, а оболочка по умолчанию - csh - в ней не работает.. хм..
Спасибо сказали:
Аватара пользователя
skeletor
Сообщения: 1224

Re: Особенности BSD-шного sed

Сообщение skeletor »

Если не работает, то нужно сделать переписать скрипт так:

Код: Выделить всё

sed '/test2/ a \
\qqq'
file.name

то есть перенос строки
Спасибо сказали:
freezl
Сообщения: 2

Re: Особенности BSD-шного sed

Сообщение freezl »

Требуется помощь знающих людей - предложенный скрипт не взлетел :( А очень надо!!! Задача та же - вставить определённую строку после строки с определённым ключевым словом. Система - 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

Вот только мне надо из скрипта! А как сделать, ума не приложу - второй день бьюсь.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Особенности BSD-шного sed

Сообщение Bizdelnick »

sed '/b/a\
qqq' test.txt
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
freezl
Сообщения: 2

Re: Особенности BSD-шного sed

Сообщение freezl »

Bizdelnick писал(а):
03.05.2016 10:52
sed '/b/a\
qqq' test.txt

Почти идеал! Только после qqq надо перенос строки вставить

Код: Выделить всё

a
b
qqqd
e

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

Всё допёр!

Код: Выделить всё

#!/bin/sh
b='qqq\
'
sed '/b/a\
\'"${b}" test.txt
Спасибо сказали:
generatornikov
Сообщения: 1
ОС: FreeBSD

Re: Особенности BSD-шного sed

Сообщение generatornikov »

Да простят меня за некропостинг, но эта тема полностью соответствует моей задаче.
Но возник вопрос:
После выполнения

Код: Выделить всё

 awk '/marker/{print $0"\nText"}; !/This/{print $0}'cfg.test

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

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

Спасибо.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Особенности BSD-шного sed

Сообщение Bizdelnick »

generatornikov писал(а):
11.01.2018 14:58
как сразу записывать изменения в исходный файл?

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

generatornikov писал(а):
11.01.2018 14:58
как вставлять не после строки, а до?

Вместо

Код: Выделить всё

/marker/{print $0"\nText"};
сделайте

Код: Выделить всё

/marker/{print "Text\n"$0};


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

Ищется строка, совпадающая с регулярным выражением. Именно она и оказывается в переменной $0.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить