2015-09-16 3 views
-2

Я хотел бы использовать grep для удаления всех строк в файле, заканчивающемся ]: таким образом, что следующая строка начинается с I или EOF.Как удалить строки с помощью grep на основе условий?

То есть: Удалите все строки, которые заканчиваются ]:и следуют строки, начинающейся с I отслуживших-файла.

Учитывая следующее:

I am an invalid line ]: 
I am a valid line ]: 
some text 
some text 
some text 
I am a valid line ]: 
some text 
I am an invalid line ]: 
I am a valid line ]: 
some text 
some text 
some text 

Выход должен быть

I am a valid line ]: 
some text 
some text 
some text 
I am a valid line ]: 
some text 
I am a valid line ]: 
some text 
some text 
some text 

Обратите внимание, что 1-й и 8-й линии I am in invalid line ]: были удалены, так как она закончилась ]: и следующая строка начинается с I

+0

почему 'некоторые Text' действительны, если действительные строки только' I' и ':] 'и * * NOT ** 'invalid' в них? –

+0

Я обновил вопрос – Bobo

ответ

1
grep -v 'invalid' file.txt 

Это должно сделай это. С -v вы просите выбрать строки, не соответствующие этим критериям.

Пример:

$ cat ~/test.txt 
I am an invalid line ]: 
I am a valid line ]: 
some text 
some text 
some text 
I am a valid line ]: 
some text 
I am an invalid line ]: 
I am a valid line ]: 
some text 
some text 
some text 

$ grep -v 'invalid' ~/test.txt 
I am a valid line ]: 
some text 
some text 
some text 
I am a valid line ]: 
some text 
I am a valid line ]: 
some text 
some text 
some text 

Обновление на основе изменения вопроса

sed ':a;N;$!ba;s/]:\nI/]:xxx\nI/g' ~/test.txt | grep -v 'xxx' 

С помощью этого метода, я заменить ]:\nI с ]:xxx\nI. Посмотрите, как я ввел xxx за строку, заканчивающуюся ]: -newline-I? Тогда я Grep и удалить те строки, которые имеют xxx

+0

Я обновил вопрос. Формат может измениться. Персонажи]: и я в начале заголовков не изменится. – Bobo

+1

Можете ли вы обновить свой вопрос на примере другого формата и желаемого результата? Сделав это, добавьте комментарий, и я обновлю свой ответ – zedfoxus

+0

Я обновил вопрос – Bobo

1

Этот AWK должен работать для вашего требования:

awk '/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1' file 

Выход:

I am a valid line ]: 
some text 
some text 
some text 
I am a valid line ]: 
some text 
I am a valid line ]: 
some text 
some text 
some text 

РАСПАД:

/\]:$/{pno=NR;prec=$0;next} # if ]: is at line end store line # and line and move to next 
pno && !(/^I/ && NR==pno+1) # if next row starts with I and we have prev vars set 
{print prec; pno=0}   # print previous line and rest prev line # to 0 
1       # default action to print current record 
0

Все остальные ответы, кажется излишним для меня, так что, может быть, я что-то не хватает, но:

sed 'N;/]:\nI/D' 
Смежные вопросы