Как сделать, многострочный поиск и текст замены (удаляют) рекурсивно

Дуга Linux не имеет отдельных пакетов для -dev и это является двоичным (в отличие от хинду). Могло бы быть несколько вещей, как tk который не втянут по умолчанию. Вот python package для дуги.

4
10.08.2012, 02:08
1 ответ

Sed может сделать много вещей около простого поиска-и-замены, и это включает многострочную поддержку.

Вот сообщение в блоге о том, как кто-то сделал это (он записал a sedml сценарий для "sed мультилиния": http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/

Основная идея состоит в том, чтобы скопировать целый файл в sed's, "содержат буфер", выполняют regex на этом и затем выписывают измененный файл. Однако этот подход может быть довольно медленным, если Ваши файлы являются большими, поскольку Вы загружаете целый файл за один раз в память.

4
27.01.2020, 20:56
  • 1
    Для Вашего другого вопроса на том, из чего необходимо выйти: пока Вы используете одинарные кавычки в оболочке, и шаблон больше не содержит # символы между разделителями (который я не ожидал бы в строке base64_encoded), необходимо смочь сделать 's@#c3284d#[^#]*#/c3284d#@@g' без дальнейшего выхода. Единственными вещами, из которых необходимо было бы выйти в кавычках, являются sed метасимволы и s разделитель (в этом случае, таким образом, Вы в порядке). –  Bristol 09.08.2012, 13:46
  • 2
    Где я храню sedml сценарий и как я добавляю его к пути удара? Что делает [^#]* в средней середине? Как заключительная команда похожа? grep -rl '#c3284d#' * | while read i; do sedml $i 's@#c3284d#[^#]*#/c3284d#@@g' $i.tmp; done;? Это перезаписывает существующий файл? Действительно ли там какие-либо случаи являются заменой, не работал бы (например, когда что-то отсутствует между этими двумя шаблонами)? –  testing 09.08.2012, 14:09
  • 3
    1. Я лично сделал бы каталог bin в Вашем корневом каталоге и помещенный все Ваши собственные сценарии там, затем для добавления его к пути можно добавить export PATH="$PATH:~/bin" в один из Ваших файлов запуска (.bashrc). 2. [^#]* : Скобки обычно означают 'любой из этих символов', за исключением того, что каре вначале превращает его в 'любого кроме этих символов'. Так [^#] соответствия любой символ это не #. * в средствах конца "любое количество", таким образом, Вы соответствуете любой последовательности символов, которая не содержит #. исчерпывание пространства... –  Bristol 09.08.2012, 18:06
  • 4
    3. Команда корректна как этот. Можно измениться $i.tmp только к $i в конце для перезаписи оперативных файлов (при рассмотрении sedml сценария он использует $1.tmp вносить изменения и затем перемещает файл в $2 в конце, если успешный). 4. Команда, столь же данная, будет работать, если разделители будут точно как даны и между разделителями нет никаких # символов. (Можно хотеть проверить, что это работает правильно над одним или двумя файлами вручную, sedml FILE 's@#c3284d#[^#]*#/c3284d#@@g' FILE.tmp и посмотрите, является ли результат тем, что Вы ожидаете (эта версия не перезаписывает оригинал). –  Bristol 09.08.2012, 18:11

Теги

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