Удалить шаблон кода, используя sed? - PullRequest
2 голосов
/ 13 февраля 2012

Я хочу использовать sed для удаления части кода (абзаца), начиная с шаблона и заканчивая точкой с запятой (;).

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

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

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

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

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

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

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

РЕДАКТИРОВАТЬ к комментарию Harsh :

Попробуйте следующую 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.
1 голос
/ 13 февраля 2012

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

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

x
y

Пояснение:

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

N.B. Это находит любой шаблон /x/, чтобы найти шаблон начало , использующий /^x/.

EDIT:

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

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