Parece que você pode usar sed para fazer este trabalho, mesmo que não saiba sobre a classe de caracter [[:ascii:]] . Em vez disso, podemos especificar todos os caracteres ASCII com um intervalo de seqüências de escape [\d0-\d127] , desde que usemos as C ou POSIX locales.
Aqui está um comando que deve ser confiável:
LC_ALL=C sed -r ':a;N;s|^([\d0-\d127]+)\n([\d0-\d127]+)$| / |;ta' file
Notas
-
LC_ALL=CUse as configuraçõesClocale apenas para este comando (caso contrário, você receberá um erro) -
-rUse o regex estendido para tornar o comando mais legível (precisamos de menos barras invertidas) (o GNUsedtambém reconhece-Ecom o mesmo significado). -
:aLabel - o loop começa aqui -
;Separa os comandos, como no shell -
NLeia a próxima linha no espaço de padrão, para que possamos substituir\n -
s|old|new|Substituiroldpornew -
^([\d0-\d127])\n([\d0-\d127]+)$- combina duas linhas apenas com ASCII e captura a primeira linha eme a segunda linha em.^é o início da linha,\né uma nova linha e$é o fim da linha, por isso^line 1\nline 2$testa a totalidade deline 1eline 2. -
/A primeira e segunda linhas, separadas por/em vez de uma nova linha. -
ta- Se o último comando de pesquisa e substituição tiver êxito, execute o loop novamente. Isso nos permite processar todas as linhas do arquivo, lidando com todas as instâncias em que houver mais de duas linhas all-ASCII juntas.
Muito obrigado a Eliah Kagan por mostrando-me como usar sequências de escape para corresponder aos caracteres ASCII .