Но я думаю, что необходимо быть очень осторожными с ним. При злоупотреблении этого шаблона Вы сделаете очень сложный дизайн и еще более сложный код.
Как в этом примере с TextEditor: если у Вас есть только один SpellChecker, возможно, не действительно необходимо использовать МОК? Если Вы не должны писать модульные тесты или что-то...
Так или иначе: будьте разумны. Шаблон разработки хорошие методы , но не Библия, которая будет проповедоваться. Не засовывайте его везде.
Используйте эту команду:
egrep -lRZ "\.jpg|\.png|\.gif" . \
| xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g'
egrep
: найти совпадающие строки с использованием расширенных регулярных выражений
-l
: перечислить только совпадающие имена файлов
-R
: рекурсивный поиск по всем заданным каталогам
-Z
: использование \ 0
в качестве разделителя записей
«\. jpg | \ .png | \ .gif»
: соответствие одному строк «. jpg»
, «. gif»
или «. png»
.
: начать поиск в текущем каталоге
xargs
: выполнить команду с аргументом stdin
-0
: использовать \ 0
в качестве разделителя записей. Это важно, чтобы соответствовать -Z
из egrep
и не вводить в заблуждение пробелы и символы новой строки во входных именах файлов.
-l
: использовать одну строку для каждой команды в качестве параметра
sed
: s tream ed itor
-i
: заменить входной файл выходным без выполнения резервная копия
-e
: используйте следующий аргумент в качестве выражения
's / \. jpg \ | \ .gif \ | \ .png / .bmp / g'
: замените все вхождения строки ". jpg"
, ". gif"
или ". png"
с ". bmp"
Честно говоря, как бы я ни любил sed для соответствующих задач, это определенно задача для Perl - он действительно более эффективен для такого рода однострочных, особенно для того, чтобы «записать его туда, где он происходит от "(переключатель perl -i
делает это за вас, и, при желании, также позволяет вам сохранить старую версию, например, с добавленным .bak, просто используйте вместо этого -i.bak
).
perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/
вместо сложной работы в sed (если там вообще возможно) или awk ...
try something using a for loop
for i in `egrep -lR "YOURSEARCH" .` ; do echo $i; sed 's/f/k/' <$i >/tmp/`basename $i`; mv /tmp/`basename $i` $i; done
not pretty, but should do.