如何将文字制表符“\t”分配给变量并仅在将其作为定界符添加到排序命令时才对其进行解释?

How can I assign a literal tab "\t" to a variable and interpret it only when I add it as a delimiter to the sort command?

我有这个有效的命令:

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

但是这个:

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

returns:

sort: multi-character tab ‘\t’

出现这个问题的原因是在这种情况下:

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

“d”包含不可见的选项卡,而在另一种情况下:

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

“d”按字面意思包含“\t”。

如何解决这个问题?

更新 1:

之所以不能直接给变量赋值d=$'\t'来解决问题,是因为它是经验不足的人设置的

正确的语法是首先正确分配变量。

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

如果要将 字符串 \t 转换为制表符,例如使用 echo -eprintf,甚至使用像这样的变量扩展:

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}' <&-)" ...

或者只需在您最喜欢的工具中编写您自己的解析器,将带有 C 转义序列的字符串转换为其字面意义。