Usando sed,
- se houver uma carta no começo da linha,
- capture qualquer quantidade de caracteres que não sejam espaços em branco e
- substitua os caracteres capturados pelo
<i>...</i>.
assim:
sed '/^[a-zA-Z]/ s!\([^ ]*\)!<i></i>!' < file > file.new
Nesta entrada de amostra:
Snapdragon Plant with a two-lipped flower.
Snap-fastener = *press-stud.
Snapper Any of several edible marine fish.
Snappish 1 curt; ill-tempered; sharp. 2 inclined to snap.
A saída é:
<i>Snapdragon</i> Plant with a two-lipped flower.
<i>Snap-fastener</i> = *press-stud.
<i>Snapper</i> Any of several edible marine fish.
<i>Snappish</i> 1 curt; ill-tempered; sharp. 2 inclined to snap.
Para detalhar as partes do comando sed:
-
/^[a-zA-Z]/- este é um filtro de endereço; significa aplicar o comando subseqüente somente às linhas que correspondem a essa expressão regular. A expressão regular requer que uma letra (minúsculaa-zou maiúsculaA-Z) deva seguir o início da linha^. -
s!\([^ ]*\)!<i></i>!- este é o comando de pesquisa e substituição. Utiliza um delimitador entre a busca e a substituição; o delimitador comum é uma barra invertida, mas como o texto de substituição possui uma barra invertida, alterei o delimitador para um ponto de exclamação!. O termo de pesquisa tem duas partes: o parêntese de captura, que precisa ser escapado, e a expressão regular[^ ]*, que diz: "corresponde a qualquer coisa - exceto um espaço, zero ou mais vezes*. A substituição text faz referência a esse grupo capturado come o envolve com a tag HTML.
Para envolver adicionalmente cada linha não vazia com tags de parágrafo, adicione outra expressão sed:
sed -e '/^[a-zA-Z]/ s!\([^ ]*\)!<i></i>!' -e '/./ { s/^/<p>/; s!$!</p>! }' < file
A expressão adicional diz:
- linhas de correspondência que têm um (qualquer) caractere - isso salta as linhas em branco
-
{agrupa os próximos dois comandos juntos - pesquise e substitua o início da linha
^por uma tag de parágrafo de abertura - pesquise e substitua o fim da linha
$por uma tag de parágrafo de fechamento -
}termina o agrupamento