Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Bash скрипт, Поиск и замена текста в файле
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3375
Пользователь №: 38635
На форуме: 2 года, 11 месяцев, 11 дней
Карма: 170




Доброго всем.

В bash опыта маловато, знаком на уровне "как дела, чем вечером занимаешься?"

Задача:
из репозитария берется php файл а-ля конфиг.
В нем присутсвуют инструкции вида

define('CONST', '');
$config['part']['subpart'] = '';

и т.д.

Т.е. либо объявленны константы, либо переменые, все с пустыми значениями.

Что известно:
- имена констант;
- имена переменных;
- значения, которыми их нужно проинициализировать;

Что гарантировано?
- синтаксис php

В чем загвоздка?
Скрипт должен корекно прописать значение переменной при любом верном синтаксисе php.

Подробнее в примере.
Допустим, мы знаем, что $config['part']['subpart'] должно быть равно "value";
На первый взгляд напрашивается замена в лоб
sed -ie s/"\$config['part']['subpart']=''"/"\$config['part']['subpart']='value'"/ "config.php"


НО:
Программист Иван Пертров, который последним коммитил репозитарий, изменил кавычки, заодно разнес запись о переменной на несколько строк, да еще и забыл удалить из нее тестовое значение.
Итог, в репозитарии лежит не $config['part']['subpart'] = '';
а

$config['part']["subpart"] 
=

"Udachi v otladke"
;


Синтаксис верен, просто кавычки разные, переменная записана на нескольких строках и значение не стерто.

Ну, в общем, как-то так :)

В какую сторону копать?



--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3375
Пользователь №: 38635
На форуме: 2 года, 11 месяцев, 11 дней
Карма: 170




Собственно говоря, алгоритм примерно такой:

по имени переменной или константы ищем ее вхождение в файл и "нормализуем строку / строки" в удобноперевариваемый вид.
Например, заменяем двойные кавычки на одинарные, если имеется значение, то удаляем его, удаляем все пробелы, табы и сиволы переноса строки. В итоге имеем нечто красивое в одну строку типа
$config['part']['subpart'] = '';


Удаляем исходное, записываем "нормализованное".

А дальше задача сводится к уже решенной :)

Замечу, проводить данную операцию над всем файлом нельзя, т.к. в файле есть проинициилизированные переменные/константы, неизвестные скрипту, и их значения должны быть сохранены.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
paul85  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1836
Пользователь №: 32147
На форуме: 4 года, 7 месяцев, 22 дня
Карма: 35




О как...
Цитата
Скрипт должен корекно прописать значение переменной при любом верном синтаксисе php.

Вот этим занимается интерпритатор PHP. Его создавать для решения подобной задачи - утопия. Поэтому правильная мысль "нормализовать" файл перед тем как вносить изменения через регулярки (в данном случае sed). В принципе решить подобную задачу можно и на PHP, но раз требуется shell - извольте.

Я бы приводил к нормальному виду с помощью примерно такого скрипта:

#!/bin/bash

cat config.php | while read x
do
if [[ "$x" == *"\$config"* ]]; then
a=1
fi

if [ "$a" == "1" ]; then
string="$string $x"
else
echo $x
fi

if [[ "$x" == *";"* ]]; then
a=0
echo $string | sed "s/\"/'/g" | sed 's/\s\+//g'
string=''
fi
done


Он убьет разметку, но работоспособность php скрипт потерять не должен... Данный сценарий shell меняет в ключах $config все двойные кавычки на одинарные. Это недопустимо, если в качестве ключа используется переменная в двойных кавычках (хоть кавычки и не нужны, но от программиста так оформляющего текст, можно ожидать чего угодно ;) )... Тут надо смотреть. Возможно не стОит менять, а просто подумать над регуляркой по замене значений. Чтобы она воспринимала и те и другие, например.

Далее применяются ваши правила по замене.

P.s. Зависит от конкретного примера, так можно гадать сколь угодно долго.
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Oyeme  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Reality is wrong. Dreams are for real
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1674
Пользователь №: 16955
На форуме: 7 лет, 9 месяцев, 12 дней
Карма: 94




Я бы посоветовал Вам хранить файлы для конфугирации в других форматах.
Цитата
YAML,XML


--------------------
Programming: Private lessons via skype £45/h

Частные уроки в Лондоне / удаленно по skype.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
paul85  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1836
Пользователь №: 32147
На форуме: 4 года, 7 месяцев, 22 дня
Карма: 35




Oyeme, каждый раз парсить XML и раскладывать в переменные? Не накладно это по ресурсам?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3375
Пользователь №: 38635
На форуме: 2 года, 11 месяцев, 11 дней
Карма: 170




paul85
спасибо за скрипт, сейчас покурим... smile.gif

Остальным тоже спасибо за участие, дабы дальнейшие дебаты об php и прочих xml не плодить, поясню:

Есть готовый продукт.
Исходники лежат в репозитарии, переодически группой разработчиков фиксятся баги, исходники коммитятся, выпускаются новые версии.

Дабы процесс установки/апдейта упростить, решено было написать скрипт-установщик.
По вполне понятным причинам, апачу доступа к репозитарию нет, следовательно, вариант php отпадает.
Объявить на работе: народ, теперь конфиги храним в xml, потому что так легче для установки.. нуу.. как бы неэтично по отношению к кодерам smile.gif Я бы послал smile.gif



--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Oyeme  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Reality is wrong. Dreams are for real
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1674
Пользователь №: 16955
На форуме: 7 лет, 9 месяцев, 12 дней
Карма: 94




Цитата
Oyeme, каждый раз парсить XML и раскладывать в переменные? Не накладно это по ресурсам?

О каких ресурсах идет речь?Файлы с конфигурациями обычно занимают пару десяток строк.

Для этого и были придуманны форматы для хранения конфигураций.Чтобы Вы не выдумывали решения ,как это делает автор темы.


Цитата (AllesKlar @ 4.01.2014 - 22:07)
paul85
спасибо за скрипт, сейчас покурим... :)

Остальным тоже спасибо за участие, дабы дальнейшие дебаты об php и прочих xml не плодить, поясню:

Есть готовый продукт.
Исходники лежат в репозитарии, переодически группой разработчиков фиксятся баги, исходники коммитятся, выпускаются новые версии.

Дабы процесс установки/апдейта упростить, решено было написать скрипт-установщик.
По вполне понятным причинам, апачу доступа к репозитарию нет, следовательно, вариант php отпадает.
Объявить на работе: народ, теперь конфиги храним в xml, потому что так легче для установки.. нуу.. как бы неэтично по отношению к кодерам :) Я бы послал :)

Потому что эти форматы как раз и для того чтобы Вы хранили в них свои конфигурации.

Я бы Вам посоветовал формат YAML

http://www.yaml.org/

Какой формат Вы бы не выбрали он будет в любом случаи удобней и лучше чем parsing
$config['part']['subpart'] = '';


У Вас не верная архитектура хранения конфигураций,и не верное проектирование "обновления файлов"

Вам следует разделать commits на что можно обновлять , а что нет.
Файлы с конфигурациями должы быть добавлены в ignore list .


--------------------
Programming: Private lessons via skype £45/h

Частные уроки в Лондоне / удаленно по skype.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3375
Пользователь №: 38635
На форуме: 2 года, 11 месяцев, 11 дней
Карма: 170




Oyeme
Интересное решение, нужно будет поразмыслить на досуге.
Одно дело шоп на коленках, другое дело серьезный комерческий продукт, где двухкопеешная оптимизация потом выливается в экономию друдонедель отдела.

Надо с архитектором поговорить, может и внедрим smile.gif


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
paul85  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1836
Пользователь №: 32147
На форуме: 4 года, 7 месяцев, 22 дня
Карма: 35




Oyeme, но его ведь нет в PHP по дефолту. YAML.
Может быть я и не прав - тогда поправь меня. Но по-моему нужно стараться использовать по-максимуму дефолтные библии, дабы облегчить жизнь админу - деплойщику.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Oyeme  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Reality is wrong. Dreams are for real
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1674
Пользователь №: 16955
На форуме: 7 лет, 9 месяцев, 12 дней
Карма: 94




Цитата (paul85 @ 5.01.2014 - 02:16)
Oyeme, но его ведь нет в PHP по дефолту. YAML.
Может быть я и не прав - тогда поправь меня. Но по-моему нужно стараться использовать по-максимуму дефолтные библии, дабы облегчить жизнь админу - деплойщику.

Есть библиотеки которые попали в список по default,а есть которые не попали.В этом то и есть разница.

В php в самом начале было всего пару библиотек,спустя года их уже десятки.

Так же и на уровне linux.При настраивания сервера с чистого листа.
Вы устанавливаете десятки разных библиотек.

Само ядро линкус состит из одинх библиотек.

В php Вы подключаете библиотеку строчкой extension=php_curl.dll
и таких библиотек сотни.


--------------------
Programming: Private lessons via skype £45/h

Частные уроки в Лондоне / удаленно по skype.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса