Depois de ver exemplos compactos de perl e awk de Gilles, eu relutei em postar isso, mas eu já tinha passado pelo exercício, e é um roteiro funcional, que é razoavelmente documentado; este ponto por si só pode ser de interesse para alguns .. (sed com comentários! :)
Este script considera as linhas em branco como espaços em branco, mesmo que contenham espaços em branco.
Vários espaços no texto são condensados em um único espaço.
O espaço em branco à direita é removido das linhas de texto.
Linhas em branco consecutivas são reduzidas a uma única linha. O script deixa as linhas em branco superior e inferior intactas.
Para qualquer coisa mais do que os scripts mais triviais, o sed pode ser escrito muito mais facilmente de forma estruturada, como um arquivo de script separado. Aqui está um exemplo.
usando sintaxe de regex estendida
chame: $ sed -rf script texto-arquivo
:first-empty-line
#================
/^[[:space:]]*$/ { # if pattern-space is empty...
$q # last line # flush-quit
n # pattern-flush=nextline-continue
:subsequent-empty-line
#=====================
/^[[:space:]]*$/ { # if pattern-space is empty...
$d # last line # pattern-delete-cycle
N # pattern+=nl+nextline
s/.*\n// # scrap the leading 'blank' line
t subsequent-empty-line # branch-on-substitute
}
}
:text-line
#=========
$q # last line # flush-quit
s/^(.*)[[:space:]]*// # trim trailing whitespace
s/ +/ /g # condense mulltiple spaces
N # pattern+=nl+nextline
/^.*\n[[:space:]]*$/ { # if newly-read line is blank
P # pattern-first-line-print
s/^.*\n// # remove the leading 'text' line
t first-empty-line # branch-on-substitute
}
# read line is text
s/\n/ / # replace \n with a space
t text-line # branch-on-substitute
Nota: flush
, nos comentários, significa: enviar o espaço de padrão para o processamento de stdout interno do sed. Isso não significa uma impressão definitiva para stdout. A saída depende da opção -n
do sed. por exemplo. o comando q
significa flush e quit ... Compare estes dois trechos: echo x |sed -e q
imprime x, echo x |sed -ne q
não imprime nada, enquanto usar o comando p
imprimirá 'x' duas vezes ou uma vez, dependendo da opção -n
.