区切り文字が複数の空白の場合、カットを使用すると単語分割が実行されます。

区切り文字が複数の空白の場合、カットを使用すると単語分割が実行されます。

以下を実行するbashスクリプトを実行しています。

cut -d ' ' -f2 <<< "aaa bbb"

答えを得ました:

bbb

区切り文字で複数の空白がある場合(例:3つ):

cut -d ' ' -f2 <<< "aaa   bbb"

結果:

 bbb

これは Debian 8 で実行されます。

debian 10で実行されているのと同じスクリプトは別の出力を生成します。

区切り文字で複数の空白がある場合(例:3つ):

cut -d ' ' -f2 <<< "aaa   bbb"

結果は空白だけ""です。

私はDebian 8からDebian 10と同じ動作をしたいと思います。どんなアイデアがありますか?

(わかりました。tr -sを使用して3つのスペースを削除できますが、動作が異なる理由を理解したいと思います。)

ありがとう、ジョス

答え1

cut私は最近の行動がそのような変化を受ける資格がないと思います。また、Debian 8.11 と GNU coreutils 8.23 を使用してcut状況を再現することはできません。

cutただし、パラメータにダッシュを付けると、-f 2-フィールド2から始まるすべてのフィールドが取得されます。私はこれがあなたが説明するものと密接に一致していると思います。

$ cut -d ' ' -f2- <<< "aaa   bbb"
  bbb

出力には、bbbフィールド2(空)、3(空)、および4()の間のフィールド区切り文字である2つの先行スペースがあります。あなたの質問に先行スペースがありますが、これが意図的なものかどうかはわかりません。

答え2

私が作ったパッチフィールドモードで動作し、複数の連続した区切り文字を単一の区切り文字として扱う新しい-mコマンドラインオプションが追加されました。cutこれは基本的にOPの問題をかなり効率的な方法で解決します。私はまた、このパッチがcoreutilsプロジェクトにマージされることを望み、数日前にこのパッチのアップストリームを送信しました。

いくつかありますもっと考えるスペース関連の機能を追加することについてのフィードバックを持ち、cutこれらすべてにフィードバックを提供することをお勧めします。より多くのパッチを実装し、cutそれをアップストリームに送信してユーティリティをより多様にし、さまざまな実際のシナリオで利用できるようにしたいと思います。

関連情報