2010-01-26 6 views
3

В сценарии оболочки sh.Удалить все строки между двумя строками

Приведенных данные в текстовом файле:
string1
строка2 бред
бред
string3 бред
String4

Как вы могли использовать AWK или СЭД, чтобы удалить все строки между строке2 (включительно) и string3 (не включая строку 3)?

закончить с:
string1
string3
String4

+0

Хех, если вы измельчаете _both_ string2 и string3 и все между ними, это легко в sed: '/ string2 /,/string3/d' –

ответ

2

вы можете попробовать это. Все, что до «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 
+0

. Ваши входные и выходные данные выглядят правильно. Тестирование ... –

+0

Это комплексное решение, которое работает в моем случае. Благодаря! –

0

Вот замена образца регулярное выражение:

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

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

+0

Предполагаю, что это Perl, не так ли? Потому что это не похоже на «awk или sed» (как мне кажется). :-P –

+0

Да, и sed не делает и не жадных. –

+0

bad flag in substitute command: 's' Это что, perl? –

3

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

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

или СЭД:

sed '/string3/p; /string2/,/string3/d' 
+1

Это полностью рад. Синтаксис Sed & awk никогда не придерживается меня, поэтому каждый раз, когда я вижу такие вещи, я сравниваю их с магией. – jsoverson

+0

Эти строки находятся на разных линиях. После каждой строки, которая является динамической, есть еще одно слово. –

+0

Они полностью работали, если они были на линиях сами по себе. Но вскоре я понял, что вы спросили, есть ли какие-то слова до или после строки, которую не нужно было удалять, которые были на одной линии. –

1

Следующая будет работать в СЭД

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

предполагая, мы соответствие до первого появления string3 после строка2