2013-12-04 4 views
0

я должен использовать СЭД в скрипт, чтобы исправить текст, который похож на это:заменить, когда нашли шаблон в несколько строк с использованием СЭД

>ABC 25 15 
> 
>FILE def.exe 3 
>INDEX 
> 
>ABC 12 40 
> 
>FILE abc.exe 2 
>INDEX 
> 
>ABC 20 18 
> 
>FILE def.exe 5 
>INDEX 
> 
> 

Что мне нужно изменить «ABC» шаблон для «DEF», каждый раз, когда последующая строка показывает мне «FILE def.exe». Обратите внимание, что между линией «ABC» и линией «ФАЙЛ» есть пустая строка, которая должна оставаться. В конце процесса, файл должен быть таким:

>DEF 25 15 
> 
>FILE def.exe 3 
>INDEX 
> 
>ABC 12 40 
> 
>FILE abc.exe 2 
>INDEX 
> 
>DEF 20 18 
> 
>FILE def.exe 5 
>INDEX 
> 
> 

Я пытался использовать СЕПГ с опцией С, чтобы заменить часть текста, но не удалось. Если у кого есть предложение, я буду благодарен.

ответ

3
sed '/^>ABC/{N;N;/FILE[ ]*def.exe/s/>ABC/>DEF/}' input 

Добавьте опцию -i к СЭД, если вы хотите изменить входной файл.

Производит:

>DEF 25 15 
> 
>FILE def.exe 3 
>INDEX 
> 
>ABC 12 40 
> 
>FILE abc.exe 2 
>INDEX 
> 
>DEF 20 18 
> 
>FILE def.exe 5 
>INDEX 
> 
> 
+0

мы бежим тот же 'sed'? Потому что это не работает для меня. Ubuntu 13.10, 'bash4.2',' sed4.2' – gongzhitaao

+1

@gongzhitaao Я считаю, что perreal основывал регулярное выражение на тексте, показанном в вопросе. Вы просто удалили символы «>». – cosjav

+0

@cosjav Ой, пропустил это. – gongzhitaao

0

Использование gnu awk (из-за селектором запись)

awk '/def.exe/ {sub(/>ABC/,">DEF")} {print $0 RS}' RS="INDEX" file 
>DEF 25 15 
> 
>FILE def.exe 3 
>INDEX 

> 
>ABC 12 40 
> 
>FILE abc.exe 2 
>INDEX 

> 
>DEF 20 18 
> 
>FILE def.exe 5 
>INDEX 

> 
> 
INDEX 
Смежные вопросы