问题描述
我有此命令有效:
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 -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}' <&-)" ...
或者只需在您喜欢的工具中编写自己的解析器,即可将带有C转义序列的字符串转换为其字面意思。