Многострочное удаление с помощью sed - PullRequest
5 голосов
/ 05 января 2011

Я пытаюсь использовать sed, чтобы удалить все вхождения

#ifdef _WIN32

#endif

Где все, что существует между #ifdef и #endif, является пустой строкой. У меня ограниченный опыт использования sed, я прочитал некоторую документацию по многострочным функциям, но я не могу понять это. Любая помощь приветствуется!

Ответы [ 3 ]

5 голосов
/ 05 января 2011

Вы можете попробовать sed -e '/^#ifdef _WIN32/,/^#endif/d', но это не обобщает более сложные случаи вложения.

4 голосов
/ 06 января 2011

Для этой работы я бы рекомендовал использовать инструмент, предназначенный для этой работы, а не sed.

  • Использовать коан ;он имеет режим для выборочного редактирования #ifdef и #ifndef и #if и #elsif строк.Например, вы будете использовать:

    coan source -U_WIN32 sourcefile.c
    

Это будет относиться ко всем _WIN32 разделам, оставляя только то, что было необходимо.

См. Также мои связанныевопрос: Есть ли препроцессор C, который устраняет блоки #ifdef на основе значений, определенных / неопределенных?

2 голосов
/ 05 января 2011

Если существуют пары #ifdef _WIN32/#endif, между которыми есть непустые строки, которые вы не хотите удалить, используйте следующее:

sed 'N;N;s/\n#ifdef _WIN32\n[[:space:]]*\n#endif\n/\n/;P;D'

Input

this is the first line
#ifdef _WIN32
  // Don't delete this comment!
#endif

stuff here
more stuff here
#ifdef _WIN32

#endif
last line

Выход

$ sed 'N;N;s/\n#ifdef _WIN32\n[[:space:]]*\n#endif\n/\n/;P;D' ifdef.sed
this is the first line
#ifdef _WIN32
  // Don't delete this comment!
#endif

stuff here
more stuff here
last line
...