Это изменит только первое появление «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