(Un / De) сжать строку в Bash? - PullRequest
       18

(Un / De) сжать строку в Bash?

8 голосов
/ 24 сентября 2011

Можно ли сжать / распаковать строку в bash, используя stdin / stdout?

Я пробовал это, но, видимо, это не поддерживается?

hey=$(echo "hello world" | gzip -cf)
echo $hey # returns a compressed string
echo $hey | gzip -cfd
gzip: stdin is a multi-part gzip file -- not supported

Я не очень разбираюсь в Linux, но я читал справочные страницы по другим утилитам сжатия и не смог найти решение?

Ответы [ 2 ]

11 голосов
/ 24 сентября 2011

Если для вас приемлема потеря степени сжатия 33%, вы можете хранить сжатые данные в кодировке base64:

me$mybox$ FOO=$(echo "Hello world" | gzip | base64) # compressed, base64 encoded data
me$mybox$ echo $FOO | base64 -d | gunzip # use base64 decoded, uncompressed data
Hello world

Это будет работать, но каждые 3 (сжатых) байта будут храниться в 4 байтах текста.

6 голосов
/ 24 сентября 2011

Когда вы делаете:

hey=$(echo "hello world" | gzip -cf)

В переменной hey нет тех же байтов, что и в /tmp/myfile, созданной:

echo "hello world" | gzip -cf > /tmp/myfile

Вы получаете сообщение об ошибке «gzip: stdin - это многокомпонентный файл gzip - не поддерживается» просто потому, что вы нарушили сжатые данные, которые нельзя распаковать.

Конструкция VAR=$(...) предназначена для работы с текстом. Вот почему вы получаете дополнительный трейлинг, например.

...