使用 tr 命令对文件中的文本进行编码

Using tr command to encode text form a file

我正在尝试将文本文件中的每个字符更改为 ASII table 中的下一个字符,从 space 到 ~。例如,A 被 B 替换,z 被 [ 替换,等等。编码将环绕,波浪号 (~) 将被 space 替换。我确定这不是最简单的方法,但这是我目前拥有的

tr ' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' '!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ' < mydata.txt

这给了我

-bash: !"#$%: event not found

是否有我没有看到的快速修复方法,或者此方法是否行不通?我需要为此使用 tr 命令。

问题是你没有在第一个字符串中映射嵌入的 ',所以事情有点不稳定。

tr ' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' '!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ' < mydata.txt

在第一行中,& 之后有一个单引号,它标志着第一个单引号字符串的结尾。括号等位于任何引号之外。反引号也会给你 gyp。然后 ~ 之后的单引号标记一个新的单引号字符串的开始,然后下一个单引号是结束,所以第二个感叹号在任何引号之外,因此给你错误。

您需要使用序列 '\'' 在单引号字符串中嵌入单引号:

tr ' !"#$%&'\''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' '!"#$%&'\''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ' < mydata.txt

根据需要在单引号内留下感叹号、反引号等。

在序列'…'\''…'中,省略号后的第一个单引号终止当前单引号字符串,反斜杠和单引号给出一个单引号,然后最后一个单引号恢复单引号字符串。

请注意,您可以编写比您使用的命令更简单的命令:

tr '0-6' '1-60'

额外的好处是您没有任何嵌入的单引号等,使事情变得混乱。此外,您还可以看到如何将它扩展到 8 位 ISO 8859-x 代码集中的重音字符,等等。小心映射换行符,但它在控制字符上也能很好地工作。它确实对您的代码没有的代码集做出了假设。 OTOH,如果您在写出的版本中对字符进行了错误的排序,您可能会得到一些有趣的错误映射。或者也许错误映射是可取的。无论如何,这是一个同样有效的替代符号。