![这些 tr 命令到底有什么作用?](https://linux22.com/image/13979/%E8%BF%99%E4%BA%9B%20tr%20%E5%91%BD%E4%BB%A4%E5%88%B0%E5%BA%95%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我正在重写一些在 Windows 计算机上使用 WSL 运行的命令,并且需要在 Python 中完成相同的事情。我很难弄清楚这些命令到底要完成什么。
以下是命令以及到目前为止我对它们的了解:
wsl tr -dc \'\\007-\\011\\012-\\015\\040-\\376\' < some.txt > someother.txt
- 我认为此命令使用八进制转义序列范围从 some.txt 中删除一些垃圾字符。但同样,我很难弄清楚到底删除了哪些字符以及文本文件中的哪些字符被删除。wsl tr -d \'\\333\' < someother.txt > some.txt
- 这对我来说完全是个谜。我查了一下八进制 333,它甚至有与之相关的 ASCII 码。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
意味着删除每个字节,除了其值在以下参数中给出的字节之外。换句话说,保留指定的字节,并丢弃所有其他字节。保留的字节是:
\007-\011\012-\015
:值为 7 到 13 的字节,即控制字符 贝尔(贝尔),BS(退格键),HT(水平制表符),LF(换行),VT(垂直制表符),FF(换页)和CR(回车)。顺便说一句,Windows 行结尾是两个字符序列 CR LF,而 Unix 行结尾是单个字符 LF。\040-\376
: 这涵盖了所有可打印 ASCII 字符以及大多数未使用的字符 127 和除某些原因 255 之外的所有非 ASCII 字符。字节值 255 不会出现在 UTF-8 中,而是许多传统 8 位字符集中的普通字符。
因此,这是一种有点奇怪的方法,用于删除控制字符(除了所有空白字符和一些非空白字符),并且还删除一些有缺陷的软件将其解释为文件结尾的字节 255。
第二个命令将以下两个参数传递给tr
:-d
和\333
。它删除 ( -d
) 字节\333
(十进制为 219,十六进制为 0xdb)。我不知道为什么人们可能想要删除这个特定的字节值。
第三个命令将以下参数传递给tr
:|
和(空格)。这会将每个出现的字符
|
(ASCII 垂直线,又名管道)替换为普通的 ASCII 空格。这会替换所有出现的|
,而不仅仅是“某些”出现的。
在 Python 中,您可以使用:
import re
那么re.sub(rb'\000-\006\016-\037\377', rb'', x)
, 或bytes.maketrans
其次是x.翻译x.replace(b'\333'. b'')
x.replace(b'|'. b' ')
1一些实现tr
支持多字节字符,但不支持 GNU tr
,据我所知, GNU 是 WSL 提供的。