Quoting
這些 tr commnads 到底是做什麼的?
我正在重寫一些在 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 \"|\" \" \"
- 這個命令據說是用空格替換某些管道字元,但我很難弄清楚是哪些。我很感激任何幫助!謝謝!
顯然,這些不是 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 的字節,即控製字元 BEL (bell) , BS (backspace) , HT (horizontal tab) , LF (line feed) , VT (vertical tab) , FF (form feed)和CR (carriage return ) . 順便說一句,Windows 行尾是兩個字元序列 CR LF,而 Unix 行尾是單個字元 LF。\040-\376
:這包括所有可列印的 ASCII 字元以及大部分未使用的字元 127 和所有非 ASCII 字元(出於某種原因 255 除外)。字節值 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.translatex.replace(b'\333'. b'')
x.replace(b'|'. b' ')
¹一些
tr
支持多字節字元的實現,但不支持 GNUtr
,據我所知,它是 WSL 提供的。