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

  • Изменение цвета каталога с помощью zsh + Prezto
  • Как узнать, почему и где установлена ​​переменная env $ PATH?
  • zsh, развернуть * до (a | b | c)
  • Livesearch с первыми 10 матчами в качестве предварительного просмотра для zsh-history?
  • XTerm не обновляет изменения vim должным образом
  • Тематические руководства Zsh
  • Запрос цвета zsh
  • Получение «zsh: command not found: time» при запуске `time` в подселле
  • 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 - лучшая ОС в мире.