2013-12-11 2 views
2

Я хочу добавитьMatch шаблон Append линия, но исключает шаблон линии

<br \> 

в конце каждой строки в-между тегом

<div> ... </div> 

исходный файл

bla bala 
<div> 
bla bala 
bla bala 
bla bala 
</div> 
bla bala 

I хотите иметь вне положить как

bla bala 
<div> 
bla bala <br \> 
bla bala <br \> 
bla bala <br \> 
</div> 
bla bala 

Я попытался это, но он также добавляет к слогана

sed -i '' '/<pre\>/,/<\/pre\>/ s/$/<br \\>/' test.txt 

также попытался это

sed -i '' '/<pre\>/,/<\/pre\>/{/$/<br \\>/;}' test.txt 

Как можно исключить строку, которая имеет шаблон матча?

обновление: можете ли вы сделать это с помощью sed?

+0

Вы вызываете проблемы при анализе 'html' с регулярными выражениями. – Birei

ответ

2

С sed:

sed '/<div>/,/<\/div>/s/[^>]$/<br \/>/' test.html 

Он будет применять команду заменить на ряд линий, описанных на начало и конец рисунка, разделенных ,:

/<div>/,/<\/div>/ 

Подставляющая команда (si mplified):

s/$/<br \/>/ 

... заменят окончания строк с <br /> тегами.

К сожалению, диапазон шаблонов включает в себя открывающие и закрывающие теги <div>, и нет возможности сообщить sed, что он должен использовать только линии между шаблоном начала и конца. Вот почему я добавил [^>], чтобы избежать этого \n будут размещены после того, как теги, что последняя команда:

s/[^>]$/<br \/>/ 

Другое решение применить замену только на линии между <div> тегами может выглядеть следующим образом (может быть более чистым и вообще):

sed '/<div>/,/<\/div>/ {/<div>/n; /<\/div>/ ! {s/$/<br \/>/}}' test.html 

Он будет выбрать диапазон в том числе открытие и закрытие Div теги и линии между ними, как в приведенном выше примере, но затем пропускает отверстие <div> метку, используя n команды и закрытие </div>, используя ! перед следующим блоком между фигурными фигурными скобками. Для получения дополнительной информации ознакомьтесь this


Однако, хотя мне нравится получать удовольствие, используя sed Я бы не использовать регулярные выражения, чтобы манипулировать HTML или XML-документов в реальном приложении.Для этого я бы использовал xslt.

4

Нечто подобное делает:

$ awk '/<\/div>/ {p=0} p{$0=$0"<br \>"} /<div>/ {p=1} 1' file 
bla bala 
<div> 
bla bala<br \> 
bla bala<br \> 
bla bala<br \> 
</div> 
bla bala 
+0

спасибо, хотя он работает, можете ли вы сделать это с sed? – kuruvi

+0

Ну, hek2gml написал хороший ответ с 'sed'. Я отправил сообщение с 'awk', поэтому мы вместе используем теги, которые вы использовали для своего вопроса. – fedorqui

0

Это может работать для вас (GNU СЭД):

sed '/<div>/,/<\/div>/!b;//!s/$/ <br \\>/' file 

Sed имеет особенность: при пустой регулярное выражение принимает предыдущее регулярное выражение значение.

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