Se você tem um Awk que suporta expressões regulares para o separador de registros RS
, isso pode ser feito assim:
awk 'BEGIN { RS = " +| *\\?\n" } 1'
A vantagem disso é que não estamos armazenando o arquivo inteiro na memória e fazendo alguma substituição de regex; sua entrada pode ter gigabytes por muito tempo.
Basicamente, tratamos o arquivo como tendo dois separadores de registro: um ou mais espaços, ou então zero ou mais espaços seguidos por uma nova linha, que pode ser precedida por uma barra invertida opcional.
Tendo delimitado os registros desta forma, tudo o que precisamos fazer é imprimi-los, seguido pelo separador de registro de saída padrão ( ORS
), que, obviamente, é nova linha. Isso é obtido por uma regra de ação padrão que consiste em 1
.
Ou uma tarefa de pipeline com sed
e tr
, não usando nada que não esteja em POSIX:
tr '\n' ' ' | sed -e 's/\//g' -e 's/ \+/ /g' | tr ' ' '\n'
Substitua novas linhas por espaços. Em seguida, a squash é executada em vários espaços em um espaço, removendo as barras invertidas. Em seguida, mapeie espaços para novas linhas.