выделение строк с помощью sed - PullRequest
2 голосов
/ 13 ноября 2010

Я пытаюсь сопоставить замену блока из нескольких строк на sed и не могу понять ...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql',     'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'testblah',                      # Or path to database file if using     sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used     with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used     with sqlite3.
    }
}

Я думаю, что самый простой способ сделать это - что-то вроде этого;

sed -i "s/^DATABASES\s?+=\s?+{$+8/test/" settings.py

Короче говоря, я хочу найти, что DATABASES = { включает в себя 8 следующих строк в кадре и замените это чем-то другим.

Есть идеи, что случилось?

Ответы [ 4 ]

2 голосов
/ 13 ноября 2010
$ cat > f.sed
/^DATABASES/,/^}/c\ 
\
A block of replacement\
...text.
$ sed -f f.sed test.txt

Обновление: в общем, нужно смотреть на SO ответы как на направления, а не готовые рецепты.Как указывает Брайан, детали в регулярных выражениях будут влиять на то, насколько общий и конкретный ответ.Возможно, вы захотите сделать любое предложение более или менее подходящим для любого класса паттернов ...

1 голос
/ 14 ноября 2010

Это, вероятно, легче решить в perl, чем в sed.С одной стороны, выполнять многострочные совпадения тривиально.

perl -0777 -pe 's/foo.*?bar/glarch/sg'

Но с другой стороны, вы можете сделать рекурсивное сопоставление с вложенными скобками, что, боюсь, вам может понадобиться здесь.Поскольку Perl использует ERE, а sed использует BRE, вам будет легче, так как вам не понадобится так много обратной косой черты.

Кроме того, поддерживаются все вещи типа \s+.

Кроме того, если это текст UTF-8, у вас все еще будет все в порядке;просто добавьте флаг командной строки типа -CSD.

Также есть транслятор sed-to-perl под названием s2p, так что вы знаете, что это правильный суперсет.

Черт возьмиконечно много также с.☺

1 голос
/ 13 ноября 2010

Если вы не обязаны использовать sed, grep -A 8 'ваше регулярное выражение' может работать. (GNU grep)

1 голос
/ 13 ноября 2010

Регулярные выражения недостаточно мощны, чтобы точно соответствовать парам фигурных скобок.Для этого вам понадобится грамматика без контекста.Ниже приведен наиболее близкий к исходному вопросу вопрос, который может выполнить sed:

Замените строку, начинающуюся с DATABASES, а 9 следующих строк - test

sed -n -e '/^DATABASES/i test' -e '/^DATABASES/{n;n;n;n;n;n;n;n;n;n;};p' settings.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...