Используя sed и grep/egrep, чтобы искать и заменить

Но я думаю, что необходимо быть очень осторожными с ним. При злоупотреблении этого шаблона Вы сделаете очень сложный дизайн и еще более сложный код.

Как в этом примере с TextEditor: если у Вас есть только один SpellChecker, возможно, не действительно необходимо использовать МОК? Если Вы не должны писать модульные тесты или что-то...

Так или иначе: будьте разумны. Шаблон разработки хорошие методы , но не Библия, которая будет проповедоваться. Не засовывайте его везде.

95
задан ndsvw 2 February 2019 в 23:55
поделиться

3 ответа

Используйте эту команду:

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"

181
ответ дан 24 November 2019 в 05:48
поделиться

Честно говоря, как бы я ни любил sed для соответствующих задач, это определенно задача для Perl - он действительно более эффективен для такого рода однострочных, особенно для того, чтобы «записать его туда, где он происходит от "(переключатель perl -i делает это за вас, и, при желании, также позволяет вам сохранить старую версию, например, с добавленным .bak, просто используйте вместо этого -i.bak ).

perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/

вместо сложной работы в sed (если там вообще возможно) или awk ...

11
ответ дан 24 November 2019 в 05:48
поделиться

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.

0
ответ дан 24 November 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: