Удалить строки из файла между совпадениями - PullRequest
1 голос
/ 17 апреля 2019

Как удалить все строки между двумя шаблонами в файле, используя .

Здесь шаблон //test и //endtest, содержимое файла:

blah blah blah
c
f
f
[
]
//test
all text to be deleted 
line1
line2
xyz
amv
{
//endtest
l
dsf
dsfs

Ожидаемый результат:

blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs

Ответы [ 3 ]

3 голосов
/ 17 апреля 2019

Это общая особенность sed

 sed '/^\/\/test$/,/^\/\/endtest/d'

Поскольку / используется для привязки регулярных выражений, их необходимо экранировать в регулярном выражении.

Если вы хотите сохранитьотметки (согласно запросу):

sed '/^\/\/test$/,/^\/\/endtest/{//!d}'

Объяснение:

Посмотрите на info sed, найдите sed address -> Regexp Addresses и Range Addresses.

Заключено в { ... }, символ // означает любую границу.

Пустое регулярное выражение '//'повторяет последнее совпадение регулярного выражения (то же самое сохраняется, если пустое регулярное выражение передается команде' s ').

! означает not, затемd для delete line

Альтернатива: Вы можете написать:

sed '/^\/\/\(end\)\?test$/,//{//!d}' 

или

sed -E '/^\/\/(end)?test$/,//{//!d}'

Будет работать так же, но все равно, это может изменить эффект, если может существовать какой-то дополнительный шаблон //endtest до первого открытого шаблона (//test).

... Все это было сделано,используя GNU sed 4.4 !

Под MacOS, BSD sed

В MacOS я успешно отбросил нужные строки с этим синтаксисом:

sed '/^\/\/test$/,/^\/\/endtest/{/^\/\/\(end\)\{0,1\}test$/!d;}'

или

sed -E '/^\/\/test$/,/^\/\/endtest/{/^\/\/(end)?test$/!d;}'
2 голосов
/ 17 апреля 2019

с awk:

$ awk '/\/\/endtest/{p=0} !p; /\/\/test/{p = 1}' file
blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs
0 голосов
/ 17 апреля 2019

если ваши данные в файле 'd', попробуйте gnu sed:

sed -E '/\/\/test/,/\/\/endtest/{/\/\/.*test/!d}' d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...