Замена текста по шаблону

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

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Замена текста по шаблону

Сообщение TechnoMag »

Нужно изменить текст в файле по шаблону. Тоесть найти подстроку в строке и заменить всю строку.
Нужна связка (x)Dialog (выбор фалйа) +bash.
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
gorilych
Сообщения: 14
ОС: Debian sid

Re: Замена текста по шаблону

Сообщение gorilych »

> найти подстроку в строке и заменить всю строку.

по подстроке bca заменяем всю строку на replaced:

$ echo -ne '1abc\n2bac\n3bca\n4cba\n5cab\n6acb\n'|sed '/bca/ c replaced'
1abc
2bac
replaced
4cba
5cab
6acb

остальное не понял.
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: Замена текста по шаблону

Сообщение Poor Fred »

gorilych писал(а):
20.01.2008 03:35
остальное не понял.

Очевидно гуёвое надо.

Ну тогда KFileReplace.
Убить всех человеков!
Спасибо сказали:
Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Замена текста по шаблону

Сообщение TechnoMag »

2gorilych
есть xDialog в котором можно выбрать файл, возвращается при этом полный путь к файлу. Вот надо насти строку в конфиг-файле в определенным пераметром и переписать ее добавив туда путь к файлу.
Короче нужно в файле preferences для IceWM изменять таким образом картинку на рабочий стол.
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Замена текста по шаблону

Сообщение sash-kan »

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

p=/path/to/file/with/image # получается от xdialog или откуда угодно
# ищем и заменяем
sed -ie "s/^ *DesktopBackgroundImage *=.*/DesktopBackgroundImage=\"$p\"/" /path/to/icewm/preferences
# если строки не было, или она была закомментирована (а это дело можно при желании учесть)
# то просто добавляем строку в конец файла:
grep '^ *DesktopBackgroundImage *=.*' /path/to/icewm/preferences >/dev/null || echo \
"DesktopBackgroundImage=\"$p\"" >> /path/to/icewm/preferences

для учета sed-ом закомментированной строки можно использовать такое регулярное выражение:

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

^ *#* *DesktopBackgroundImage *=.*
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Замена текста по шаблону

Сообщение TechnoMag »

sash-kan писал(а):
20.01.2008 17:57

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

p=/path/to/file/with/image # получается от xdialog или откуда угодно
# ищем и заменяем
sed -ie "s/^ *DesktopBackgroundImage *=.*/DesktopBackgroundImage=\"$p\"/" /path/to/icewm/preferences
# если строки не было, или она была закомментирована (а это дело можно при желании учесть)
# то просто добавляем строку в конец файла:
grep '^ *DesktopBackgroundImage *=.*' /path/to/icewm/preferences >/dev/null || echo \
"DesktopBackgroundImage=\"$p\"" >> /path/to/icewm/preferences

для учета sed-ом закомментированной строки можно использовать такое регулярное выражение:

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

^ *#* *DesktopBackgroundImage *=.*


не работает, ругается на неверный параметр s/^
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Замена текста по шаблону

Сообщение sash-kan »

TechnoMag писал(а):
20.01.2008 23:36
ругается на неверный параметр s/^
возможно, параметр i надо отделить от e.
sed -i -e
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
gorilych
Сообщения: 14
ОС: Debian sid

Re: Замена текста по шаблону

Сообщение gorilych »

я бы заменил

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

sed -ie "s/^ *DesktopBackgroundImage *=.*/DesktopBackgroundImage=\"$p\"/" /path/to/icewm/preferences

на

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

sed -i 's%^ *DesktopBackgroundImage *=.*%DesktopBackgroundImage="'$p'"%' /path/to/icewm/preferences


дабы у шелла не возникало илюзий по поводу использования звёздочек и т.д, а у sed - не возникало проблем со слэшами в пути до файла.

Да и опция -e здесь не нужна.

Разумеется, если в имени файла встретится знак процента, то опять возникнет проблема. Поэтому переменную $p можно переконвертить, заменив все / на \/, например так:

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

p=$(echo $p|sed 's/\//\\\//g')


Разумеется, если в имени файла встретятся другие спец-символы, их тоже придётся заэкранировать.
Спасибо сказали:
Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Замена текста по шаблону

Сообщение TechnoMag »

2gorilych

Попробую конечно и ваш рариант, но думаю, у меня может возникнуть такая же проблема с параметром s/

Подскажите как преюбразовать строку вида

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

/mnt/geek/Music/Dr. Alban/Dr. Alban - It's my life(mix).mp3


в

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

/mnt/geek/Music/Dr.\ Alban/Dr.\ Alban\ -\ It's\ my\ life\(mix\).mp3


Точно не знаю какие символы нужно еще экранировать, но возможно еще надо и символ " ' ".
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Замена текста по шаблону

Сообщение diesel »

вот так например:

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

diesel@gfl-1150:~$ echo "/mnt/geek/Music/Dr. Alban/Dr. Alban - It's my life(mix).mp3" | sed -r -e 's!(\s|[()])!\\\1!g;'
/mnt/geek/Music/Dr.\ Alban/Dr.\ Alban\ -\ It's\ my\ life\(mix\).mp3
Спасибо сказали:
Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Замена текста по шаблону

Сообщение TechnoMag »

Всем спасибо! Вопрос решен! Оценил возможности sed.
И на последок, где взять помощь на русском по sed, желательно (наверное всем чайникам на первых парах они требуются) с примерами. :)
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
Аватара пользователя
Evgueni
Сообщения: 599
ОС: Ubuntu ☹

Re: Замена текста по шаблону

Сообщение Evgueni »

TechnoMag писал(а):
23.01.2008 00:52
Всем спасибо! Вопрос решен! Оценил возможности sed.
И на последок, где взять помощь на русском по sed, желательно (наверное всем чайникам на первых парах они требуются) с примерами. :)

Ну, например, в книге "Программное окружение Unix" Кернигана и Пайка. Да и фактически в любой книге по Unix - это азы (но мне больше нравится perl :) ).
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Замена текста по шаблону

Сообщение sash-kan »

Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: