cat -e file.txt
dá:
{"yellow":"mango"}^M$
^M$
{"yellow":"banana"}^M$
^M$
{"yellow":"blabla"}^M$
^M$
e eu gostaria de ter apenas:
{""yellow":"mango"}^M$
{"yellow":"banana"}^M$
{"yellow":"blabla"}^M$
no lugar para todos os arquivos com extensão txt na pasta. Então eu tentei:
find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/^M$^M$/^M$/g"
para nenhum proveito. Alguém tem uma idéia melhor?
head -n 3 file.txt | od -bc
rendimentos:
0000000 173 042 171 145 154 154 157 167 042 072 042 155 141 156 147 157
{ " y e l l o w " : " m a n g o
0000020 042 175 015 012 015 012 173 042 142 141 142 141 142 042 072 042
" } \r \n \r \n { " b a b a b " : "
0000040 155 141 156 147 157 042 175 015 012
m a n g o " } \r \n
0000051
isto:
awk 1 RS='\r\n' ORS= < file.txt
remove as novas linhas completamente (então não é bom: quero manter uma das duas sucessivas em cada linha, mas faz alguma coisa).
Você pode usar
sed -z 's/\r\n\r\n/\r\n/g'
.Normalmente
sed
só funciona em uma linha de cada vez. Ao usar a-z
opção,sed
funcionará em linhas, que são separadas por0
bytes, que normalmente não existem em um arquivo de texto, então todo o arquivo será tratado como uma linha e as novas linhas poderão ser substituídas.(encontrado no stackoverflow e explicação adicionada)
Você também pode excluir linhas que contenham apenas o retorno de carro.
Com GNU Sed:
Para uma máquina mínima, mas compatível com POSIX (aqui precisamos gerar o retorno de carro com Printf):
^
corresponde ao início de linha e o último$
, o fim de linha (\n
).Por exemplo:
Se não houver problema em remover todas as linhas em branco, você pode fazer:
E se você preferir substituir seu(s) arquivo(s), você pode usar a
-i
opção (no local):A linha acima copiará os arquivos originais como
*.bak
arquivos. Se você não se importa em ter backups, pode deixar de fora a.bak
parte, assim:(Você pode até usar curingas, então em vez de
file1 file2 file3 ...
escreverfile*
.)A vantagem dessa abordagem é que ela faz alterações em seus arquivos de uma só vez (em vez de ter que executá-la uma vez para cada arquivo).
Mas lembre-se: isso manterá apenas as linhas que contêm pelo menos um caractere que não seja espaço em branco. Portanto, se uma linha consiste apenas em cinco espaços, uma tabulação, um retorno de carro e um caractere de avanço de linha, ela não será mantida.
Acho que você poderia usar o separador de registros e o separador de registros de saída do awk para atingir o objetivo, que deve ser mais eficiente em arquivos muito grandes do que arquivos
sed -z ...
.Usando Raku (a linguagem anteriormente conhecida como Perl6)
O exemplo acima imprime apenas linhas que contêm caracteres que não são espaços em branco (
\S
corresponde a um único caractere que não é espaço em branco). Uma versão muito legível abaixo:HTH.
https://raku.org
https://rakudo.org/downloads