sed
é um utilitário texto . Ele trabalha com linhas de texto (seqüências de caracteres não-NUL (não bytes) de tamanho limitado delimitados por um caractere de nova linha).
Se você quiser alterar os 2 nd e 5 th byte de uma seqüência de bytes, ele não funcionará por vários motivos :
-
sed
funciona no texto. Se a entrada contiver caracteres NUL, não terminará em um caractere de nova linha, terá mais de LINE_MAX bytes entre dois caracteres de nova linha, conterá sequências de bytes que não formam caracteres válidos, dependendo da implementaçãosed
, ganhou ' t trabalho em tudo. (note que o GNUsed
não possui muitas dessas limitações). - mesmo se essa entrada binária formar um texto válido,
.
corresponderá a caracteres, não a bytes, portanto, poderá corresponder a mais de um byte. - porque o código sed é executado para cada linha da entrada, que mudaria o segundo e quinto caractere de cada linha, não da entrada inteira.
Para tratar entradas como matrizes arbitrárias de bytes (sem a limitação de bytes NUL ou limitações de tamanho), você pode usar perl
:
dd.... | perl -0777 -pe 'for $o (1, 4) {substr($_, $o, 1) = "|"}'
Exemplo:
$ printf 'add... | xxd -p | sed '1s/../7c/2;1s/../7c/5' | xxd -p -r
b dd.... | perl -0777 -pe 'for $o (1, 4) {substr($_, $o, 1) = "|"}'
cd' |
> perl -0777 -pe 'for $o (1, 4) {substr($_, $o, 1) = "|"}' |
> od -Ax -tx1 -tc
000000 61 7c 62 00 7c 64
a | b $ printf 'add... | xxd -p | sed '1s/../7c/2;1s/../7c/5' | xxd -p -r
b%pre%cd' |
> perl -0777 -pe 'for $o (1, 4) {substr($_, $o, 1) = "|"}' |
> od -Ax -tx1 -tc
000000 61 7c 62 00 7c 64
a | b %pre% | d
000006
| d
000006
Ou você pode usar uma representação de texto intermediário, como usar vim
' xxd
helper:
xxd -p
fornece um dump hexadecimal com 60 caracteres por linha, por padrão. Acima estamos substituindo o segundo e quinto hex de 2 dígitos da primeira linha com 7c
, o número para ASCII |
.