Как я могу назначить литеральную вкладку » t» переменной и интерпретировать ее только тогда, когда я добавляю ее в качестве разделителя в команду сортировки?

#bash #sorting #environment-variables #delimiter #csv

#bash #сортировка #переменные среды #разделитель #csv

Вопрос:

У меня есть эта команда, которая работает:

 sort -t$'t' -uk6,6 device_scan.txt
  

Но это:

 d='t'
sort -t$"$d" -uk6,6 device_scan.txt
  

ВОЗВРАТ:

 sort: multi-character tab ‘\t’
  

Причина этой проблемы объясняется тем фактом, что в этом случае:

 d=$'t'
echo -n "$d"
  

«d» содержит невидимую вкладку, в то время как в этом другом случае:

 d=$"t"
echo -n "$d"
  

«d» содержит » t» буквально.

Как решить эту проблему?

Обновление 1:

Причина, по которой я не могу просто присвоить d=$'t' переменной для решения проблемы, заключается в том, что она устанавливается менее опытными людьми.

Комментарии:

1. Обратите внимание, что $'...' это не связано с $"..." — синтаксис $"..." предназначен для поддержки перевода сообщений в зависимости от локали, см. Перевод локали bash вручную . Это не связано с интерпретацией специальных символов.

2. Ваша «причина» для попытки неправильно использовать $"$d" синтаксис является фиктивной.

Ответ №1:

Правильный синтаксис заключается в правильном назначении переменной в первую очередь.

 d=$'t'
sort -t"$d" ...
  

Если вы хотите преобразовать строку t в символ табуляции, используйте, например echo -e , или printf , или даже с расширением переменной, например, так:

 d='t'
sort -t"${d//\t/$'t'}" ...
sort -t"$(echo -e "$d")" ...  # note - echo is _very_ not portable
sort -t"$(printf "$d")"  ... # be aware of printf formatting strings
  

Однажды я обнаружил хитрость с использованием awk синтаксического анализа переменных, которая кажется лучшим вариантом:

  sort -t"$(awk -v var="$d" 'BEGIN{print var}' <amp;-)" ...
  

И, в качестве альтернативы, просто напишите свой собственный синтаксический анализатор в вашем любимом инструменте, который преобразует строку с escape-последовательностями C в ее буквальное значение.

Комментарии:

1. Спасибо за ваш бурный ответ. Благодаря вам я смог значительно улучшить свой вопрос, который, к сожалению, нуждается в повторном прочтении.

2. What is the right syntax? Для чего? «Правильный» синтаксис тесно связан с намерением. why I can't just assign d=$'t' to the variable to solve the problem is that it is set by less experienced peopl Как уже было сказано, вы можете преобразовать t в tab с помощью echo -e или с помощью printf . Укажите ваше намерение — вы намерены поддерживать назначение переменной менее опытными людьми, которые будут печатать t с намерением ввести вкладку? Итак, преобразуйте символ.

3. Может показаться, что вы задаете вопрос XY — возможно, вас вообще не интересует «правильный синтаксис», просто любой возможный метод преобразования строки с escape-последовательностями C в ее значение. (Тем не менее, ваш вопрос начинается с «как можно назначить литеральную вкладку переменной»)

4. Спасибо за решение sort -t"$(printf "$d")" -uk6,6 device_scan.txt . Почему этот sintax: sort -t"$(printf "$d")" -uk6,6 device_scan.txt лучше, чем этот sintax ?….: sort -t "$(printf "$d")" -uk6,6 device_scan.txt

5. Я не вижу разницы. Вы опубликовали один и тот же код 3 раза, только с пробелом после -t .