Что делает «текст» точно в 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%

  • oh-my-zsh завершение в именах домашних каталогов
  • zsh globbing - поиск файлов с повторяющимися строками имен файлов
  • Параметр _path_files и compadd ignore-files
  • Чтение из tty в трубчатой ​​оболочке
  • Как добавить / расширить zshell доработки?
  • Backspace в zsh застрял
  • zsh - полностью расширяет двоичный путь на вкладке <tab>
  • Подсчет файлов в листах дерева каталогов
  • One Solution collect form web for “Что делает «текст» точно в Bash? Может ли он использоваться в Zsh?”

    Из документации 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' 
    Linux и Unix - лучшая ОС в мире.