Удалить содержимое блока только 1-го и 3-го вхождения - PullRequest
0 голосов
/ 02 июня 2018

Ниже sed удаляет все вхождения блоков между {content-start} и {content-end}, но хочет удалить только 1-й и 3-й блоки, а не 2-й блок.

sed -ie '/{content-start.*}/,/{content-end}/d' test.txt

test.txt:

{content-start}
abc1
def1
ghi1
{content-end}
{content-start}
abc2
def2
ghi2
{content-end}
{content-start}
abc3
def3
ghi3
{content-end}

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

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

sed -n '/{content-start}/{x;s/^/x/;x;:a;N;/{content-end}/!ba;x;/^x\{2\}$/{x;p;x};x}' file

Используйте опцию -n для репликации seds grep-like-nature.Соберите линии между маркерами начала и конца.В начале коллекции добавьте флаг в область удержания, чтобы использовать его в качестве счетчика.Собрав все необходимые строки, печатайте только в том случае, если в поле для хранения содержится нужное число.

Это решение печатает только второй блок, однако, если вы хотите исключить только блок 1 и блок 3, то:

sed '/{content-start}/{x;s/^/x/;x;:a;N;/{content-end}/!ba;x;/^x\{1\}$/{x;d};/^x\{3\}/{x;d};x}' file

Это решение удаляет только блоки 1 и 3.

0 голосов
/ 03 июня 2018

sed - для простых замен на отдельных строках, т.е. s / old / new /, , то есть все .Для всего остального вы должны использовать awk:

$ awk '{rec = rec $0 ORS} /{content-end}/{if (++cnt == 2) printf "%s", rec; rec=""}' file
{content-start}
abc2
def2
ghi2
{content-end}

или если вы когда-нибудь захотите что-то сделать с отдельными строками, то сохраните каждую строку записи в массиве, а не сохраните всю запись какстрока:

{ rec[++numLines] = $0 }
/{content-end}/ {
    if ( ++cnt == 2 ) {
        for (lineNr=1; lineNr<=numLines; lineNr++) {
            print rec[lineNr]
        }
    }
    delete rec
    numLines = 0
}

Вышеприведенное будет работать с любым awk в любой оболочке в любой системе UNIX и легко улучшить, если / когда ваши требования изменятся.

0 голосов
/ 02 июня 2018

После awk может помочь вам в этом.

awk '
/^{content-start}/{
  flag=1;
  count++}
flag && count!=1 && count!=3;
/^{content-end}/{
  flag=""}
'  Input_file

В соответствии с вашим образцом Input_file, следующим будет вывод.

{content-start}
abc2
def2
ghi2
{content-end}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...