#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
.