Substituição de várias linhas em branco com uma única linha em branco no vim / sed

38

Pergunta mais ou menos diz tudo. Estou ciente de que /^$/d removerá todas as linhas em branco, mas não consigo ver como dizer "substituir duas ou mais linhas em branco por uma única linha em branco"

Alguma idéia?

    
por Andrew Bolster 07.05.2011 / 22:19

6 respostas

39

Se você não estiver disparando vim ou sed para outro uso, o gato realmente tem uma maneira fácil de recolher várias linhas em branco, apenas use cat -s .

Se você já estava no vim e queria ficar lá, você poderia fazer isso com a pesquisa interna e substituir emitindo: :%s!\n\n\n\+!^M^M!g (O ^ M é a representação visual de uma nova linha, você pode inseri-lo pressionando < kbd> Ctrl + v Enter ), ou salve-se digitando apenas enviando para cat: :%!cat -s .

    
por 07.05.2011 / 22:24
18

Use \n para indicar uma nova linha no padrão de pesquisa. Use Ctrl + M no texto de substituição ou uma referência anterior. Veja :help pattern e :help sub-replace-special (vinculado de :help :s ).

%s/\(\n\n\)\n\+//
    
por 07.05.2011 / 22:30
5

Se no Vim, faça o seguinte:

:%!cat -s
    
por 21.11.2012 / 06:01
0

Usando o Perl:

perl -00 -pe ''
A opção de linha de comando

-00 ativa o modo slurp do parágrafo, o que significa que Perl lê texto parágrafo por parágrafo, em vez de linha por linha.

    
por 11.12.2013 / 22:00
0

Com sed (GNU sed) 4.2.2:

sed -r '
  /^\s*$/ { 
    # blank line
:NEXT
    N # append next line to pattern space - if none, autoprint PS and exit
    s/^\s*$\n^\s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
  }
  # else, autoprint PS and next/exit
' < $MYFILE
    
por 15.05.2018 / 12:49
-2

Eu sei que esse é um código bobo, mas eu queria resolver esse problema em menos de 10 min e funcionou

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done
    
por 24.03.2017 / 05:44