Dada uma string composta por 0
s e 1
s, meu objetivo é substituir 0 por 1 e vice-versa. Exemplo:
Entrada
111111100000000000000
Saída pretendida
000000011111111111111
Tentei, sem sucesso, o seguinte sed
comando
echo '111111100000000000000' | sed -e 's/0/1/g ; s/1/0/g'
000000000000000000000
o que estou perdendo?
Você pode usar
tr
para isso, seu principal objetivo é a tradução de caracteres:Seu
sed
comando substitui todos os 0s por 1s, resultando em uma string contendo apenas 1s (os 1s originais e todos os 0s substituídos) e, em seguida, substitui todos os 1s por 0s, resultando em uma string contendo apenas 0s.Em fluxos longos,
tr
é mais rápido quesed
; para um arquivo de 100MiB:Embora
tr
seja a ferramenta certa para este trabalho , você pode fazê-losed
usando oy
comando (transliteração) em vez do comandos
(substituição):y
é basicamentesed
a implementação interna detr
- com toda a sobrecarga que isso implica.Uma maneira é
echo "111111100000000000000" | sed 's/1/2/g;s/0/1/g;s/2/0/g'
Provavelmente um método lento, mas faz isso de maneira binária, usando a aritmética interna do shell:
Ou para lidar com o fluxo binário por pedaços de byte:
Se a sua string contiver apenas uma única linha e for composta apenas por 0s e 1s, você poderá usar isso
Se a string puder conter várias linhas, basta alterar e alterar
perl -e
aperl -ne
maneira de ler os bytes (já queread
precisa de um identificador de arquivo)No entanto, dessa forma, cada linha é dividida em uma string, portanto, pode não ser muito eficiente para arquivos grandes. Nesse caso, uma pequena verificação é necessária
Como você pode ver, desta forma também funciona para strings que contêm caracteres diferentes
'0'
e'1'