这些 tr 命令到底有什么作用?

这些 tr 命令到底有什么作用?

我正在重写一些在 Windows 计算机上使用 WSL 运行的命令,并且需要在 Python 中完成相同的事情。我很难弄清楚这些命令到底要完成什么。

以下是命令以及到目前为止我对它们的了解:

  1. wsl tr -dc \'\\007-\\011\\012-\\015\\040-\\376\' < some.txt > someother.txt- 我认为此命令使用八进制转义序列范围从 some.txt 中删除一些垃圾字符。但同样,我很难弄清楚到底删除了哪些字符以及文本文件中的哪些字符被删除。

  2. wsl tr -d \'\\333\' < someother.txt > some.txt- 这对我来说完全是个谜。我查了一下八进制 333,它甚至有与之相关的 ASCII 码。

  3. wsl tr \"|\" \" \"- 这个命令据说用空格替换某些管道字符,但我很难弄清楚是哪些字符。

我很感激任何帮助!谢谢你!

答案1

显然,这些不是 cmd、powershell 或 sh 语法中的命令:还有一层额外的反斜杠转义。完成反斜杠转义后,我们剩下以下 sh 命令:

wsl tr -dc '\007-\011\012-\015\040-\376' < some.txt > someother.txt
wsl tr -d '\333' < someother.txt > some.txt
wsl tr "|" " "

前两个命令从文件读取并写入文件。最后一个从标准输入读取并写入标准输出。

在 的非选项参数中tr,反斜杠后跟三个八进制数字表示其值由数字给出的字节。两个字节之间的ASCII 连字符 ( -) 表示值介于这两个字节之间(含这两个字节)的任何字节。

第一个命令将以下两个参数传递给tr:-dc\007-\011\012-\015\040-\376-dc意味着删除每个字节,除了其值在以下参数中给出的字节之外。换句话说,保留指定的字节,并丢弃所有其他字节。保留的字节是:

因此,这是一种有点奇怪的方法,用于删除控制字符(除了所有空白字符和一些非空白字符),并且还删除一些有缺陷的软件将其解释为文件结尾的字节 255。

第二个命令将以下两个参数传递给tr:-d\333。它删除 ( -d) 字节\333(十进制为 219,十六进制为 0xdb)。我不知道为什么人们可能想要删除这个特定的字节值。

第三个命令将以下参数传递给tr:|(空格)。这会将每个出现的字符|(ASCII 垂直线,又名管道)替换为普通的 ASCII 空格。这会替换所有出现的|,而不仅仅是“某些”出现的。

在 Python 中,您可以使用:

  1. import re那么re.sub(rb'\000-\006\016-\037\377', rb'', x), 或bytes.maketrans其次是x.翻译
  2. x.replace(b'\333'. b'')
  3. x.replace(b'|'. b' ')

1一些实现tr支持多字节字符,但不支持 GNU tr,据我所知, GNU 是 WSL 提供的。

相关内容