Isso pode ser mais sed do que o esperado, mas acho que essa é a melhor maneira de realizar o que você deseja com sed .
Este script:
-
Insere uma linha
<dl>antes de cada linha que contém<dt>, se nenhum outro<dt>,<dd>ou<dl>precedeu a linha. -
Anexa uma linha
</dl>após cada linha contendo<dd>, se a linha após a linha contendo<dd>não contiver<dd>.
Este script sed usa o espaço sed hold para lembrar a linha anterior para que possa verificar as tags <d[tdl]> antes de inserir a tag <dl> . Ele também usa o endereçamento relativo ADDR,+N para permitir a adição da tag </dl> de fechamento. Um caso especial é necessário para detectar se um <dd> está na última linha do arquivo e precisa de um </dl> anexado. Testes ( t e T ) e ramificação ( b ) são usados extensivamente para implementar a lógica.
#!/bin/sh
sed '
/<dt>/ {
x # exchange pattern and hold space
s/<d[tdl]>// # subsitutue, just testing for pattern
g # copy hold space back, overwriting pattern space
t end # branch to :end if previous subsitution successful
i \
<dl>
}
$ {
/<dd>/ ! b end # if <dd> on last line, append </dl>
a \
</dl>
}
/<dd>/,+1 { # on each line containing <dd> and the line after
/<dd>/ b end # if does not contain <dd>, insert </dl>
i \
</dl>
}
:end
h # copy pattern space to hold space for next round
' "$@"
Este script modifica os dados da amostra para ficarem assim:
[...]
# Hardware #
<dl>
<dt>RAM</dt>
<dd>2GB</dd>
</dl>
# Partitions #
<dl>
<dt>'/dev/sda1'</dt>
<dd>/boot</dd>
<dt>'/dev/sda2'</dt>
<dd>/</dd>
</dl>