Quoting

這些 tr commnads 到底是做什麼的?

  • March 31, 2021

我正在重寫一些在 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 \"|\" \" \"- 這個命令據說是用空格替換某些管道字元,但我很難弄清楚是哪些。

我很感激任何幫助!謝謝!

顯然,這些不是 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.translate
  2. x.replace(b'\333'. b'')
  3. x.replace(b'|'. b' ')

¹一些tr支持多字節字元的實現,但不支持 GNU tr,據我所知,它是 WSL 提供的。

引用自:https://unix.stackexchange.com/questions/642953