Удалить все строки между двумя строками - PullRequest
3 голосов
/ 26 января 2010

В скрипте оболочки sh.

Данные даны в текстовом файле:

string1  
string2 gibberish  
gibberish  
string3 gibberish  
string4  

Как вы можете использовать awk или sed для удаления всех строк между string2 (включительно) и string3 (не включая string3)?

в итоге:

string1  
string3  
string4  

Ответы [ 4 ]

3 голосов
/ 26 января 2010

Строки1, строка2, строка3 и т. Д. Находятся в разных строках?В этом случае вы можете использовать awk:

awk '/string2/{flag=1} /string3/{flag=0} !flag'

или sed:

sed '/string3/p; /string2/,/string3/d'
2 голосов
/ 26 января 2010

вы можете попробовать это. Все, что находится до "string2", не будет удалено.

awk 'BEGIN{f=0}
{
    match($0,"string2")
    if(RSTART){
        print substr($0,1,RSTART-1)
        f=1
        next
    }
    match($0,"string3")
    if(RSTART){
        $0=substr($0,RSTART)
        f=0
    }
}
f==0{print}
' file

выход

$ cat file
string1 blah blah
text before string2 junk
gibberish
gibberis string3 text here
string4

$ ./shell.sh
string1 blah blah
text before
string3 text here
string4
1 голос
/ 27 января 2010

Следующее будет работать в sed

sed  '
/string2/,/string3/bdeleting
b
:deleting
s/string3.*/string3/
/string3/b
d
'

при условии, что мы сопоставляем до первого вхождения string3 после string2

0 голосов
/ 26 января 2010

Вот пример замены регулярных выражений:

s/string2.*?(?=string3)//sg

Что удалит все от string2 до, но не включая string3.

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