これを行い、必要なスペースを削除する場合:
echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
パイプラインの最初の 2 つのコマンドは、@James が編集したように、@TMS の回答で十分に説明されています。最後のコマンドは、正しく、テスト済みであるという点で @TMS コメントとは異なります。説明は次のとおりです:
sed
は s です ストリームs
は です コマンドを置き換えます。/
正規表現を開きます - 任意の文字を使用できます。/
は従来型ですが、XML やパス名などの処理には不便です。/
または選択した代替文字によって、正規表現が閉じられ、置換文字列が開きます。/ */
で*
前の文字 (この場合はスペース) の任意のシーケンスに一致します。/
または選択した代替文字で、置換文字列を閉じます。この場合、置換文字列//
空です。つまり、一致は削除されます。g
この置換を行うオプションです g 行ごとに 1 回だけではなく、行ごとにローカルに。- 引用符は、コマンド パーサーが混乱するのを防ぎます。シーケンス全体が
sed
に渡されます。 最初のオプション、つまりsed
として スクリプト。
@TMS 脳の子 (sed 's/^ *//'
) 各行の先頭からスペースのみを取り除きます (^
行頭に一致 - sed
の 'pattern space' -話す).
さらに改行を削除したい場合、最も簡単な方法は追加することです
| tr -d '\n'
コマンドパイプに。次のように機能します:
|
以前に処理されたストリームをこのコマンドの標準入力に供給します。tr
TR です anslate コマンド。-d
一致文字の削除を指定します。- 引用符は一致する文字をリストします - この場合は改行 (
\n
).Translate は、シーケンスではなく、単一の文字のみに一致します。
sed
改行を扱うときは独特に遅れます。これは sed
のためです 最も古い unix
の 1 つです。 コマンド - 人々が自分のしていることを本当に理解する前に作成されました。レガシ ソフトウェアが蔓延しているため、問題が修正されることはありません。私は unix
より前に生まれたので、これを知っています が生まれました。
この問題の歴史的な起源は、改行が行の一部ではなく行区切りであるという考えでした。そのため、行処理ユーティリティによって削除され、出力ユーティリティによって再挿入されました。問題は、これがユーザー データの構造に関する仮定を作成し、多くの設定で不自然な制限を課すことです。 sed
が改行を簡単に削除できないことは、悲しみを引き起こす不正なイデオロギーの最も一般的な例の 1 つです。
sed
で改行を削除できます - 私が知っているすべてのソリューションが sed
を作るだけです ファイル全体を一度に処理すると、非常に大きなファイルの処理が滞り、ストリーム エディターの目的が損なわれます。可能な場合、ライン処理を保持するソリューションは、複数のパイプの読み取り不能なネズミの巣になります。
sed
の使用を主張する場合 試してください:
sed -z 's/\n//g'
-z
sed
に伝えます ヌルを行区切りとして使用します。
内部的には、C
の文字列 null で終了します。 -z
オプションもレガシーの結果であり、C
の便宜のために提供されています C
で満たされた一時ファイルを使用したいプログラマ -文字列と改行で整理されています。その後、一度に 1 つの文字列を簡単に読み取って処理できます。繰り返しますが、ユース ケースに関する初期の仮定は、ユーザー データに人為的な制限を課します。
g
を省略した場合 オプションを指定すると、このコマンドは最初の改行のみを削除します。 -z
で オプション sed
は、ファイル全体を 1 行として解釈し (ファイルに浮遊ヌルが埋め込まれていない限り)、ヌルで終了するため、これも大きなファイルでチョークします。
あなたは思うかもしれません
sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
動作する可能性があります。最初のコマンドは、行ごとに各行の先頭に null を配置し、結果として \n\x00
になります。 すべての行を終了します。 2 番目のコマンドは、各行から 1 つの改行を削除し、現在はヌルで区切られています。最初のコマンドにより、改行は 1 つだけになります。残っているのはスプリアスのヌルだけです。ここまでは順調ですね。ここでの壊れた考えは、ストリームが構築された方法であるため、パイプが行ごとに最後のコマンドを供給するということです。実際、最後のコマンドは、記述されているように、ファイル全体に改行がなく、したがって 1 行であるため、ヌルを 1 つだけ削除します。
単純なパイプの実装では中間一時ファイルを使用し、すべての入力が処理されてファイルに供給されます。次のコマンドは別のスレッドで実行され、そのファイルを同時に読み取っている可能性がありますが、ストリーム全体を (不完全ではありますが) 見ているだけで、ファイルにフィードしているチャンクの境界を認識していません。パイプがメモリ バッファであっても、次のコマンドはストリーム全体を認識します。欠陥は sed
に不可分に組み込まれています .
このアプローチを機能させるには、g
が必要です
肝心なのは、sed
を使用しないことです。 改行を処理します。
echo hello | hexdump -v -e '/1 "%02X "'
echo -n "Hello" | od -A n -t x1
説明:
echo
プログラムは次のコマンドに文字列を提供します。-n
フラグは、"Hello" の最後に新しい行を生成しないように echo に指示します。od
program は「8 進ダンプ」プログラムです。 (8 進数ではなく 16 進数でダンプするように指示するフラグを提供します。)-A n
フラグは--address-radix=n
の略です 、n は「なし」の略です。この部分がないと、コマンドは左側に醜い数値のアドレスプレフィックスを出力します。これは大きなダンプには便利ですが、短い文字列には必要ありません。-t x1
フラグは--format=x1
の略です 、x は「16 進数」の略で、1 は 1 バイトを意味します。