2012-02-13 2 views
2

Я хочу использовать sed для удаления части кода (параграфа), начиная с шаблона и заканчивая точкой с запятой (;).Удалить шаблон кода с помощью sed?

Теперь я наткнулся на пример, чтобы удалить пункт, разделенного новых линии

sed -e '/./{H;$!d;}' -e 'x;/Pattern/!d' 

Я запутался, как использовать точку с запятой не в качестве разделителя, но как шаблон вместо. Спасибо.

+0

Пожалуйста, покажите пример и данные Ожидаемые результаты. – potong

+0

Да, конечно, вход, http://pastebin.com/hHXJjtiS – Harsh

ответ

2

Другой вариант заключается в использовании расширение GNU адресного диапазона.

Следующий пример означает: удалить все из строки, которая начинается с pattern до строки, заканчивающейся точкой с запятой.

sed '/pattern/,/;$/ d' infile 

EDIT на комментарий грубодисперсных:

Попробуйте следующую команду: sed

sed '/^\s*LOG\s*(.*;\s*$/ d ; /^\s*LOG/,/;\s*$/ d' infile 

Пояснение:

/^\s*LOG\s*(.*;\s*$/ d   # Delete line if begins with 'LOG' and ends with semicolon. 
/^\s*LOG/,/;\s*$/ d    # Delete range of lines between one that begins with LOG and 
            # other that ends with semicolon. 
+0

код, который вы показываете, не зависит от каких-либо расширений GNU для обработки диапазона адресов. Это будет работать с оригинальным sed 20+ лет назад ;-) Удачи всем! – shellter

+0

Работает только в том случае, если вход в одну строку. поправьте меня если я ошибаюсь. Поэтому не следует требовать буфера. Образец http://pastebin.com/hHXJjtiS – Harsh

+0

@shellter: Спасибо, исправлено. – Birei

1

Это может работать для вас:

cat <<! >file 
> a 
> b 
> ; 
> x 
> y 
> ; 
> ! 
sed '/^[^;]*$/{H;$!d};x;s/;//;/x/!d' file 

x 
y 

Объяснение:

  • Для любой линии не имеет ни одного ; в нем /^[^;]*$/
  • Append выше линии к трюма (HS) и удалите пространство шаблонов (PS) и начните следующую итерацию, если она не является последней строкой в ​​файле. {H;$!d}
  • Если строка пуста /^$/ или последняя строка файла:
    • Своп к HS x
    • вычеркнуть первый ;s/;//
    • Поиск по шаблону (x) и если не найден удалить PS /x/!d

NB Это находит любой рисунок /x/, чтобы найти начало образец использовать /^x/.

EDIT:

После видели ваши данные и ожидаемый результат, это может работать для вас:

sed '/^\s*LOG(.*);/d;/^\s*LOG(/,/);/d' file 
+0

спасибо. это решает мои сомнения. – Harsh

Смежные вопросы