linux - substitua todas as novas linhas duplas por um espaço

4

É possível substituir apenas as novas linhas duplas em um arquivo de texto usando sed, awk, grep, tr ou o que for necessário?

this

is

data
this

is

more

data

O que eu preciso fazer é substituir todas as novas linhas duplas (\ n \ n, não há espaço em branco) por um espaço, mas manter todas as novas linhas, como ter todos os meus pontos de dados em sua própria linha.

this is data
this is more data

Isso é possível?

    
por nermolov 03.10.2015 / 17:57

3 respostas

6

Tente

    sed ':a;N;$!ba;s/\n\n/ /g'  filename

Isso primeiro lerá todo o arquivo e substituirá as novas linhas duplas (e somente aquelas!) por um espaço. Esse truque (ler todo o arquivo) é necessário porque a maioria dos utilitários GNU / Linux processa uma linha de entrada de cada vez, o que lhe daria o resultado errado.

    
por 03.10.2015 / 18:17
4

Apenas outra variante: uma awk version

awk 'BEGIN{RS="\n\n" ; ORS=" ";}{ print }' 
    
por 04.10.2015 / 00:07
1

Adicionando a resposta de @MariusMatutiae: Se o arquivo é grande demais para ler na memória, você pode usar um modo clássico, mas muito mais lento:

EMPTY=0
BUFFER=""
while read L; do
  if test -z "$L"; then
    EMPTY=$(($EMPTY+1))
    BUFFER="$BUFFER\n"
  else
    if test $EMPTY -lt 2; then
      echo -en "$BUFFER"
    else
      echo " "
    fi
    echo "$L"
    BUFFER=""
    EMPTY=0
  fi
done < filename
echo -ne "$BUFFER"
    
por 03.10.2015 / 19:24

Tags