написание bash-скрипта для изменения текста и записи в лог - PullRequest
2 голосов
/ 06 декабря 2008

Я написал очень простой скрипт bash, который поможет мне перейти с dev на staging. Он удаляет все файлы в стадии подготовки, копирует файлы из уровня разработки в стадию.

Однако в файле config.inc.php необходимо, чтобы первый экземпляр dev был изменен на stage, а другой экземпляр не изменился.

Во-вторых, каждый раз, когда я запускаю его (я запускаю скрипт из каталога dev), я хотел бы, чтобы он записывал журнал обратно в каталог dev, который будет добавлять метку даты / времени, в которую я запускал сценарий промежуточной обработки bash этот журнал.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 06 декабря 2008

Это изменит только первое появление «dev» на «stage»

sed -i '0,/dev/ s/dev/stage/' config.inc.php

Помните, что это превращает "devel" в "stageel". Эта версия ведет себя так, как вы хотите, ищется только «dev», а не «devel» (на самом деле, s/\<dev\>/stage/, поскольку выражение подстановки должно работать, но, похоже, оно работает не так, как ожидалось? Я буду рад если кто-то с большим количеством седь-фу может объяснить.)

sed -i  "/\<dev\>/,/\<dev\>/ s/dev/stage/" config.inc.php

Для регистрации:

date >> /path/to/dev/run.log

Добавлено Джонатаном Леффлером

  • Если другие проблемы решены (см. Ниже), вторая команда sed все еще может изменить devel на stagel, если строка содержит, например, " move code devel из / some / dev / расположение по адресу /some/stage/location".
  • Кроме того, вторая команда sed отобразит каждую найденную dev между первой строкой, содержащей dev, и второй такой строкой. Это имеет значение, если имеется более одной совпадающей строки, тогда как исходный '0,/dev/' (или измененный '0,/\<dev\>/') соответствует только первой строке в соответствии с запросом.
  • Причина, по которой "s/\<dev\>/stage/" не работает, это не проблема sed, а проблема оболочки. Используйте одинарные кавычки, и вы будете почти в порядке. В двойных кавычках последовательность с обратным слэшем меньше, чем sed выглядит как просто меньше.
  • Полезное правило : используйте одинарные кавычки вокруг любого аргумента в сценарии оболочки, содержащем материал регулярного выражения. Если оно не заполнено одинарными кавычками, замените каждую одинарную кавычку в регулярном выражении на кавычку последовательности, обратную косую черту, кавычку, кавычку "'\''". (Первая кавычка оканчивается строкой одинарных кавычек; кавычка обратной косой черты является одинарной кавычкой; последняя кавычка перезапускает строку одинарных кавычек.)
  • Обратите внимание, что опция '-i' является расширением GNU для sed; это легальная часть ответа, так как вопрос помечен Linux, где используется GNU sed; будьте внимательны, если вам нужно перейти на платформу, такую ​​как Solaris, AIX, HP-UX.
  • Наконец, sed не поддерживает расширенные регулярные выражения как стандартные; Вы должны явно включить их в GNU sed с опцией '-r'.

По моей оценке, если желательно перезаписать, команда должна быть:

sed -i -r '0,/\<dev\>/s/\<dev\>/stage/' config.inc.php
1 голос
/ 06 декабря 2008

Чтобы изменить слово в файле:

cat config.inc.php | sed 's:dev::stage' > config.inc.php.new 

Чтобы добавить в файл журнала:

echo $timestamp >> mylogfile.log
0 голосов
/ 06 декабря 2008

Первая часть (редактирование вашего файла) может быть выполнена с помощью утилиты потокового редактора sed:

sed -i -e s/dev/stage/ config.inc.php

Редактирует файл на месте (-i) без резервного копирования, используя выражение /dev/stage/ (-e) для замены одного выражения другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...