Что делает «текст» точно в Bash? Может ли он использоваться в Zsh?

Недавно я столкнулся с следующим предлагаемым решением:

cat results.csv | tr $'\x01' \\t > result.csv 

для преобразования некорректного CSV-файла (который использует \x01 unicode в качестве разделителя) в правильный.

Что именно делает $ '\ x01' сказать bash? Команда, похоже, не работает в Zsh.

В случае, если это имеет значение, фактическая цель состоит в том, чтобы преобразовать что-то вроде:

b'flight_uid \ twinning_price \ tbid_price \ timpressions_source_timestamp \ n'b'0FY6ZsrnMy \ x012000 \ x012270.0 \ x011427243278000 \ n0FamrXG9AW \ x01710 \ x01747.0 \ x011427243733000 \ n0FY6ZsrnMy \ x012000 \ x012270.0 \ x011427245266000 \ n0FY6ZsrnMy \ x012000 \ x012270. 0 \ x011427245088000 \ n0FamrXG9AW \ x01330 \ x01747.0 \ x011427243407000 \ n0FamrXG9AW \ x01710 \ x01747.0 \ x011427243981000 \ n0FamrXG9AW \ x01490 \ x01747.0 \ x011427245289000 \ n0FamrXG9AW \ x01735 \ x01747.0 \ x011427244634000 \ n0FamrXG9AW \ x01420 \ x01747. 0 \ x011427245595000 \ n0FamrXG9AW \ x01470 \ x01747.0 \ x011427242443000 \ n0FK9yvBt9B \ x011050 \ x011295.0 \ x011427242253000 \ n0FK9yvBt9B \ x011050 \ x0112%

в обычный файл csv, разделенный табуляцией.

Когда я пытаюсь это сделать с Zsh, я получаю следующее, что, похоже, ничего не меняет:

b'flight_uid \ twinning_price \ tbid_price \ timpressions_source_timestamp \ n'b'0FY6ZsrnMy \ x012000 \ x012270.0 \ x011427243278000 \ n0FamrXG9AW \ x01710 \ x01747.0 \ x011427243733000 \ n0FY6ZsrnMy \ x012000 \ x012270.0 \ x011427245266000 \ n0FY6ZsrnMy \ x012000 \ x012270. 0 \ x011427245088000 \ n0FamrXG9AW \ x01330 \ x01747.0 \ x011427243407000 \ n0FamrXG9AW \ x01710 \ x01747.0 \ x011427243981000 \ n0FamrXG9AW \ x01490 \ x01747.0 \ x011427245289000 \ n0FamrXG9AW \ x01735 \ x01747.0 \ x011427244634000 \ n0FamrXG9AW \ x01420 \ x01747. 0 \ x011427245595000 \ n0FamrXG9AW \ x01470 \ x01747.0 \ x011427242443000 \ n0FK9yvBt9B \ x011050 \ x011295.0 \ x011427242253000 \ n0FK9yvBt9B \ x011050 \ x0112%

Из документации bash:

 Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows: \a alert (bell) (...) \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) 

Итак, в примере, который вы опубликовали, $'\x01' – это только символ с кодом 1, согласно вашему описанию. Из моего (очень ограниченного) тестирования это, как представляется, также поддерживается zsh:

 $ printf %s $'\x01' | od -t x1 0000000 01 0000001 

Однако команда tr которую вы отправили, решит вашу проблему только в том случае, если мы предположим, что ваш файл фактически содержит буквенный символ с кодом 1; из комментариев видно, что у вас вместо этого есть четырехсимвольная строка \x01 где должен быть символ табуляции. Следующий фильтр должен исправить это условие:

 sed 's/\\x01/\t/g'