sed: Удалить пустые строки после строки, заканчивающейся маркером - PullRequest
1 голос
/ 13 октября 2011

Как мне это сделать, используя sed?

    Input:                         Expected output:
    1               |              1
    2 MARKER        |              2 MARKER
                    |              3 MARKER
                    |              4
                    |              
                    |              5 MARKER
                    |              6
                    |              
    3 MARKER        |              
                    |              7 MARKER
    4               |              8
                    |              9
    5 MARKER        |                      
    6               |               
                    |              
                    |              
    7 MARKER        |                      
                    |              
    8               |               
    9               |               

Сначала я попробовал это: не работает, потому что "# niether t или b работают, потому что d приводит к сбою сценария."

/MARKER$/ {
#   i -- Line with MARKER
:my_branch
#   i -- in branch
    # write current patt space to output and read next line to pattern space
    n
    # if non blank goto EO script
    /^$/! b
    # if blank line delete it
    /^$/ d
    # loop back for more blank lines.
    t my_branch
    # niether t or b work because d causes the script to break.
    b my_branch
}

затем я попробовал это, что почти работает: (((- он не удаляет строку между 3 и 4, что, я думаю, связано с тем, что 3 используется во время обработки 2 и, таким образом, его маркер пропущен.

/MARKER$/ {
#       i -- Line with MARKER
:my_branch
#   i -- in branch
    N
    s/MARKER\n/MARKER/
    t my_branch
    # I added the following but it doesn't help..
    /MARKER$/ b my_branch
}

есть 4-5 других версий, которые я пробовал, но ни одна не работала.

Я сделал все это, потому что пытался ответить на этот вопрос: заменил две новые строки на одну в командной строке оболочки , поэтому я начал изучать sed с http://sed.sourceforge.net/sed1line.txt и http://www.grymoire.com/Unix/Sed.html

Я знаю, что есть решения, использующие awk, perl и т. Д., Но я просто хотел научиться использовать sed.

Спасибо.

1 Ответ

1 голос
/ 13 октября 2011

см. Ниже, я думаю, что это то, что вы хотите: (он работал на моей Linux-коробке с GNU SED)

kent$  cat t
1         
2 MARKER  






3 MARKER  

4         

5 MARKER  
6         


7 MARKER  

8         
9         

kent$  sed -r ':a;N;s/(.*MARKER)\s+(\n.*)/\1\2/;ba;' t
1         
2 MARKER
3 MARKER
4         

5 MARKER
6         


7 MARKER
8         
9    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...