Удалить определенные значения строк во всех блоках, используя sed - PullRequest
0 голосов
/ 03 июня 2018

Удалите только 4-е и 5-е значения (четвертый1 и пятый1 в 1-м блоке, четвертый2 и пятый2 во 2-м блоке, четвертый3 и пятый3 в 3-м блоке) в каждом блоке.

Попробовал sed -E -e :a -e 's/(.*) ( .*$)/\1 \4 \5/; ta' и не работает.

{content-start}
first1
second1
third1
fourth1
fifth1
sixth1
{content-end}
{content-start}
first2
second2
third2
fourth2
fifth2
sixth2
{content-end}
{content-start}
first3
second3
third3
fourth3
fifth3
sixth3
{content-end}

Ответы [ 4 ]

0 голосов
/ 28 июля 2018

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

sed -n '/start/,/end/{/start/{x;s/.*//;x};x;/^x\{4,5\}$/!{x;p;x};s/^/x/;x;b};p' file

Отключить автоматическую печать, установив параметр -n.Сосредоточьтесь на линиях между start и end разделителями.Сбросьте счетчик на пустой, если текущая строка - разделитель start.Выведите все строки, кроме пятой и шестой, не забывая накапливать счетчик.Распечатать все остальные строки.

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

После awk может помочь и здесь.

awk '
/^{content-start}/{
    flag=1;
    print;
    next}
flag{
    count++}
flag && ((count==4) || (count==5)){
    next}
flag;
/^{content-end}/{
    flag=count=""}
'  Input_file
0 голосов
/ 03 июня 2018

Сед для умственных упражнений

sed -E 'N;N;N;N;N;N;N;s/(([^\n]*\n){4})([^\n]*\n){2}(.*)/\1\4/' infile
0 голосов
/ 03 июня 2018

Серьезно, не забудьте использовать sed для чего-либо, кроме s / old / new в отдельных строках.Для всего остального решение awk всегда будет представлять собой некоторую комбинацию более понятного, более простого, более эффективного, более легкого в совершенствовании / обслуживании и более портативного, чем решение sed для той же задачи.

Это просто основано на мой предыдущий сценарий awk :

$ cat tst.awk
BEGIN { badLineNrs[5]; badLineNrs[6] }
{ rec[++numLines] = $0 }
/{content-end}/ {
    for (lineNr=1; lineNr<=numLines; lineNr++) {
        if ( !(lineNr in badLineNrs) ) {
            print rec[lineNr]
        }
    }
    delete rec
    numLines = 0
}

$ awk -f tst.awk file
{content-start}
first1
second1
third1
sixth1
{content-end}
{content-start}
first2
second2
third2
sixth2
{content-end}
{content-start}
first3
second3
third3
sixth3
{content-end}

или, если вам нравится краткий и загадочный текст, это также даст ожидаемый результат при использовании любого awk, но сложнее построить и делать такие вещи, как печать или пропуск определенных записей(как в вашем предыдущем вопросе ), поэтому, кроме переносимости, он не намного лучше, чем эквивалентное решение sed:

$ awk '(NR-5)%8 && (NR-6)%8' file
{content-start}
first1
second1
third1
sixth1
{content-end}
{content-start}
first2
second2
third2
sixth2
{content-end}
{content-start}
first3
second3
third3
sixth3
{content-end}
...