$'text' 在 Bash 中到底做了什么?可以在Zsh中使用吗?

$'text' 在 Bash 中到底做了什么?可以在Zsh中使用吗?

我最近跑步进入以下建议的解决方案:

cat results.csv | tr $'\x01' \\t > result.csv

将格式错误的 csv 文件(使用\x01unicode 作为分隔符的文件)转换为正确的文件。

$'\x01' 到底告诉 bash 做什么?该命令在 Zsh 中似乎不能很好地工作。

如果重要的话,实际目标是转换如下内容:

b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012000\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0FY6ZsrnMy\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90\x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x011050\x0112%

转换为常规制表符分隔的 csv 文件。

当我使用 Zsh 尝试此操作时,我得到以下结果,这似乎没有改变任何内容:

b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012000\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0FY6ZsrnMy\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90\x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x011050\x0112%

答案1

来自 bash 文档:

Words of the form $'string' are treated specially.  The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.  Backslash escape sequences, if present, are decoded
as follows:
       \a     alert (bell)
(...)
       \nnn   the eight-bit character whose value is  the  octal  value
              nnn (one to three digits)
       \xHH   the  eight-bit  character  whose value is the hexadecimal
              value HH (one or two hex digits)

因此,在您发布的示例中,$'\x01'根据您的描述,只是代码为 1 的字符。从我的(非常有限的)测试来看,zsh 似乎也支持这一点:

$ printf %s $'\x01' | od -t x1
0000000 01
0000001

但是,tr只有当我们假设您的文件实际上包含代码为 1 的文字字符时,您发布的命令才能解决您的问题;从注释中可以看出,您所拥有的是\x01制表符应该在的四个字符的字符串。以下过滤器应解决此问题:

sed 's/\\x01/\t/g'

相关内容