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=C
Use as configuraçõesC
locale apenas para este comando (caso contrário, você receberá um erro) -
-r
Use o regex estendido para tornar o comando mais legível (precisamos de menos barras invertidas) (o GNUsed
também reconhece-E
com o mesmo significado). -
:a
Label - o loop começa aqui -
;
Separa os comandos, como no shell -
N
Leia a próxima linha no espaço de padrão, para que possamos substituir\n
-
s|old|new|
Substituirold
pornew
-
^([\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 1
eline 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 .