如何将文字选项卡“ \ t”分配给变量并仅当将其添加为sort命令的分隔符时才对其进行解释?

问题描述

我有此命令有效:

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'分配给变量来解决问题的原因是它是由经验不足的人设置的。

解决方法

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

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转义序列的字符串转换为其字面意思。