我试图将文本文件中的每个字符更改为ASII表中从空格到〜的下一个字符。例如,A被替换为B,z被[等替换。编码将环绕以使得波浪号(〜)将被空格替换。我确定这不是最简单的方法,但这是我目前所拥有的
tr ' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' '!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ' < mydata.txt
这给了我
-bash: !"#$%: event not found
是否有快速修复,我没有看到或这种方法不起作用?我需要使用tr命令。
答案 0 :(得分:1)
问题是你没有在第一个字符串中映射嵌入的'
,所以事情有点不稳定。
tr ' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' '!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ' < mydata.txt
在第一行中,您在&
后面有一个引号,它标记了第一个单引号字符串的结尾。括号等等在任何引号之外。反向报价也会给你gyp。然后~
之后的单引号标记新单引号字符串的开头,然后下一个单引号是结束,所以第二个感叹号在任何引号之外,因此会给出错误。
您需要使用序列'\''
在单引号字符串中嵌入单引号:
tr ' !"#$%&'\''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' '!"#$%&'\''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ' < mydata.txt
根据需要在单引号内留下感叹号,后引号等。
在序列'…'\''…'
中,省略号后面的第一个单引号终止当前单引号字符串,反斜杠和单引号给出单引号,然后最后一个单引号恢复单引号字符串。
请注意,您可以编写比您使用的命令更简单的命令:
tr '\040-\176' '\041-\176\040'
带来额外的好处,你没有任何嵌入式单引号等,使事情变得混乱。另外,您可以看到如何将其扩展为8位ISO 8859-x代码集等中的重音字符。警惕映射换行符,但它也会在控制字符上表现出色。它确实假设您的代码没有代码集。 OTOH,如果你在书面版本中对字符进行了错误排序,你可能会得到一些有趣的错误映射。或许错误映射是可取的。无论如何,这是另一种有效的符号。