unexpandコマンドは複数のタブをどのように処理しますか?

unexpandコマンドは複数のタブをどのように処理しますか?

拡張されていないドキュメントを読み、答えを読んでみました。ここしかし、unexpandがtablistをパラメータとして使用する方法を理解していません。

次のことを試みると(2つのスペースと3つのスペースがタブに変換されると予想されます)

$ unexpand -t 2,3,4
  12**345***678

わかりました。

12\t\t345***678

*スペースを表します(*明確にするためにこれを使用します)。空白が3つあるのに、なぜ2の後ろにはタブが2つあり、5の後にはタブがないのかわかりません。

また、次のことを試みました(2番目と5番目の列のスペースがタブに変換されると予想されます)。

$ unexpand -t 2,5
  1*23*4567

わかりました。

1*23*4567

私も試しました

$ unexpand -t 2,5
  1**2*****345

わかりました。

1\t*2*****345

複数のパラメーターがある場合、プログラムがtablistパラメーターをどのように解釈するかを理解できません。

ベストアンサー1

unexpandその逆にしてくださいexpand。これにより、unexpand -t 2,3,4 | expand -t 2,3,4元の場所に戻らなければなりません。

この数字は、タブ間の距離ではなく、位置(画面の左側からの距離)を表します。

最初のタップストップをオフセット2(3番目の列)に設定-t 2,3,4し、2番目のタップストップをオフセット3に、3番目のタップストップをオフセット4に設定すると、すべてです。

  ↓↓↓
0123456
$ printf '%b|\n' '\t' '\t\t' '\t\t\t' | expand -t2,3,4
  |
   |
    |

1、2、3 タブは次の位置にあります。

  123

これを次のように組み合わせると:

  123
12**345***678

33番目のタブストップにあるので、そこ2に行くには2つのタブが必要です。最初のタブは2番目のタブストップに移動し(すでに最初のタブストップに達したため)、2番目のタブは2番目のタブストップに移動します。 3番目のタブ停止。それ以降はタブがないため、スペースはタブに変換されません。

2番目のタブ停止が2番目のタブ停止の後の3列になり、3番目のタブ停止が2番目のタブ停止の後の4列になるようにするには、次のものが必要です-t 2,5,9

  ↓  ↓   ↓
0123456789
$ printf '\t1\t2\t3\n' | expand -t 2,5,9
  1  2   3

これにより、次のようになります。

          ↓  ↓   ↓
        01234567890
$ echo '12  345   678' | unexpand -t 2,5,9 | sed -n l
12  345\t 678$

unexpand()とtabs(サポートする端末にタブを設定するコマンド)の違いに注意してください。

  • の場合、tabs列はゼロではなく1から始まり、番号が付けられます。
  • tabs -8(代わりに)8列ごとにタブストップ設定を使用しますexpand -t 8(実際にはこれと似ていますtabs 9 17 25 33...が、それも使用できますtabs 9 +8 +8 +8...)。

おすすめ記事