WindowsシステムでWSLを使用して実行されるいくつかのコマンドを再構築しており、Pythonでも同じことを行う必要があります。このコマンドが正確に何をしようとしているのかを理解するのが困難です。
以下は、コマンドと私が今まで知っている内容です。
wsl tr -dc \'\\007-\\011\\012-\\015\\040-\\376\' < some.txt > someother.txt
- このコマンドは、some.txtからいくつかのジャンク文字を削除するために8進エスケープシーケンスの範囲を使用するようです。しかし、今回も正確にどの文字が削除されたのか、テキストファイルからどの文字が削除されたのかを把握するのが困難です。wsl tr -d \'\\333\' < someother.txt > some.txt
- これは私にとって完全な謎です。私は8進数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 "|" " "
最初の2つのコマンドはファイルを読み書きします。最後は、標準入力から読み込み、標準出力に書き込むことです。
オプション以外の引数で、tr
バックスラッシュの後に3つの8進数が続く場合、その値は数値として提供されるバイトを表します。 2バイト間のASCIIハイフン(-
)は、との間の値を持つすべてのバイトを表します。
最初のコマンドは、次の2つの引数をtr
:-dc
とに渡します\007-\011\012-\015\040-\376
。-dc
次のパラメーターに値が指定されたバイトを除くすべてのバイトを削除することを意味します。つまり、指定されたバイトは保持され、他のすべてのバイトは削除されます。予約されたバイトは次のとおりです。
\007-\011\012-\015
: 7 から 13 の値を持つバイト、つまり制御文字 ベル(ベル)、BS(バックスペースキー)、HT(水平タブ)、LF(改行)、VT(縦タブ)、FF(ページフィード)そしてCR(キャリッジリターン)。ちなみに、Windows行末は2文字のシーケンスCR LFですが、Unix行末は単一文字LFです。\040-\376
:この内容はすべての内容をカバーしています。印刷可能なASCII文字何らかの理由で最も使用されていない文字127と255を除くすべての非ASCII文字も含まれています。バイト値255はUTF-8には表示されませんが、多くの既存の8ビット文字セットでは一般的な文字です。
したがって、これは制御文字(すべての空白文字と一部の非空白文字を除く)を削除し、いくつかのバグを持つソフトウェアがファイルの終わりとして解釈するバイト255を削除するかなり奇妙な方法です。
2番目のコマンドは、次の2つの引数をtr
:-d
とに渡します\333
。 (-d
)バイト(10進数219、16進数0xdb)を削除します\333
。この特定のバイト値を削除したい理由はわかりません。
3番目のコマンドは、次のパラメータを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
マルチバイト文字をサポートしていますが、tr
私が知っている限り、WSLが提供するGNUはサポートしていません。