Особенности BSD-шного sed
Модератор: arachnid
-
- Сообщения: 158
- ОС: Gentoo; Mandriva; FreeBSD
Особенности BSD-шного sed
Чувствую себя дураком и никак не могу прикинуть: как в FreeBSD sed'ом найти строку в файле и добавить под эту строку новую строку с данными?
-
- Сообщения: 1224
Re: Особенности BSD-шного sed
После строки test2 вставить qqq. Текст находится в file.name
Код: Выделить всё
sed '/test2/ a \qqq' file.name
-
- Сообщения: 158
- ОС: Gentoo; Mandriva; FreeBSD
Re: Особенности BSD-шного sed
skeletor писал(а): ↑04.11.2009 14:36После строки test2 вставить qqq. Текст находится в file.name
Код: Выделить всё
sed '/test2/ a \qqq' file.name
Спасибо за ответ, но я неспроста написал тему в FreeBSD. По умолчанию тут используется НЕ GNU версия седа и конструкцию, что Вы написали в FreeBSD не выполняется. Пока решил просто - поставил из портов gsed - в нем как раз так работает...
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Особенности BSD-шного sed
mirlas писал(а): ↑04.11.2009 20:11skeletor писал(а): ↑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
-
- Сообщения: 158
- ОС: Gentoo; Mandriva; FreeBSD
Re: Особенности BSD-шного sed
diesel писал(а): ↑04.11.2009 21:17mirlas писал(а): ↑04.11.2009 20:11skeletor писал(а): ↑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)... Может можно еще чем-то сделать вставку строки?
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Особенности BSD-шного sed
ну можно так
Код: Выделить всё
awk '/test2/{print $0"\nqqq"}; !/test2/{print $0}' file
-
- Сообщения: 158
- ОС: Gentoo; Mandriva; FreeBSD
Re: Особенности BSD-шного sed
diesel писал(а): ↑04.11.2009 21:59ну можно так
Код: Выделить всё
awk '/test2/{print $0"\nqqq"}; !/test2/{print $0}' file
хм...:
/test2/: Event not found.
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Особенности BSD-шного sed
mirlas писал(а): ↑04.11.2009 22:20diesel писал(а): ↑04.11.2009 21:59ну можно так
Код: Выделить всё
awk '/test2/{print $0"\nqqq"}; !/test2/{print $0}' file
хм...:
/test2/: Event not found.
вы где-то с кавычками напутали(оболочка bash?)
-
- Сообщения: 158
- ОС: Gentoo; Mandriva; FreeBSD
Re: Особенности BSD-шного sed
Хм.. Да в bash работает, а оболочка по умолчанию - csh - в ней не работает.. хм..
-
- Сообщения: 1224
Re: Особенности BSD-шного sed
Если не работает, то нужно сделать переписать скрипт так:
то есть перенос строки
Код: Выделить всё
sed '/test2/ a \
\qqq'
file.name
то есть перенос строки
-
- Сообщения: 2
Re: Особенности BSD-шного sed
Требуется помощь знающих людей - предложенный скрипт не взлетел А очень надо!!! Задача та же - вставить определённую строку после строки с определённым ключевым словом. Система - pfsense. Поставить gsed не получилось (с ним всё проще было бы)
Создал файл test.txt с содержимым
написал скрипт по аналогии
При запуске выдаёт новую строку и как будто ждёт ещё какого то ввода - помогает только CTRL+C
Задача стоит управлять правилами фаервола на pfsense удалённо с другой машины по ssh в обход web. Управление простейшее - включать/выключать по запросу 2 правила.
На удалённой машине Linux и gnu sed - уже появляются мысли тянуть файл с правилами на линуксовую машину, править его там и вертать в зад. Но это бред imho.
Эта конструкция, кстати, отрабатывает норм
Вот только мне надо из скрипта! А как сделать, ума не приложу - второй день бьюсь.
Создал файл 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
Вот только мне надо из скрипта! А как сделать, ума не приложу - второй день бьюсь.
-
- Модератор
- Сообщения: 20998
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Особенности BSD-шного sed
sed '/b/a\
qqq' test.txt
qqq' test.txt
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
-
- Сообщения: 2
Re: Особенности BSD-шного sed
Почти идеал! Только после qqq надо перенос строки вставить
Код: Выделить всё
a
b
qqqd
e
Как это в скриптах делается?
Всё допёр!
Код: Выделить всё
#!/bin/sh
b='qqq\
'
sed '/b/a\
\'"${b}" test.txt
-
- Сообщения: 1
- ОС: FreeBSD
Re: Особенности BSD-шного sed
Да простят меня за некропостинг, но эта тема полностью соответствует моей задаче.
Но возник вопрос:
После выполнения
терминал вывел мне исправленную версию этого файла. Но как сразу записывать изменения в исходный файл? Т.е. просматривать промежуточный этап мне не нужно вообще (код выполняется внутри скрипта).
И еще, подскажите, как вставлять не после строки, а до?
Последний вопрос: я правильно, что таким образом (код выше) ищутся все строки с данным вхождением (marker), а не конкретно это слово? - т.е. даже если marker находится в середине строки, то вставка произойдет перед строкой, а не перед словом marker?
Спасибо.
Но возник вопрос:
После выполнения
Код: Выделить всё
awk '/marker/{print $0"\nText"}; !/This/{print $0}'cfg.test
терминал вывел мне исправленную версию этого файла. Но как сразу записывать изменения в исходный файл? Т.е. просматривать промежуточный этап мне не нужно вообще (код выполняется внутри скрипта).
И еще, подскажите, как вставлять не после строки, а до?
Последний вопрос: я правильно, что таким образом (код выше) ищутся все строки с данным вхождением (marker), а не конкретно это слово? - т.е. даже если marker находится в середине строки, то вставка произойдет перед строкой, а не перед словом marker?
Спасибо.
-
- Модератор
- Сообщения: 20998
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Особенности BSD-шного sed
Записываете во временный файл, потом заменяете им исходный.
Вместо
Код: Выделить всё
/marker/{print $0"\nText"};
Код: Выделить всё
/marker/{print "Text\n"$0};
generatornikov писал(а): ↑11.01.2018 14:58я правильно, что таким образом (код выше) ищутся все строки с данным вхождением (marker), а не конкретно это слово? - т.е. даже если marker находится в середине строки, то вставка произойдет перед строкой, а не перед словом marker?
Ищется строка, совпадающая с регулярным выражением. Именно она и оказывается в переменной $0.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |