cutの-cオプションは使えるのか?


アニメ『刀使ノ巫女』

1話目から超展開するので、ついていけず置いてきぼりにされてしまったのですが、2話最後~3話見てからようやく話が理解でき、これは面白いのかも、ともう一度1話から見始めました。登場人物の顔も覚えた後なので、一回目はつまらなかったプロローグのシーンも楽しめました。 生徒たちのトーナメント試合も改めて見ると、テンポが良くて、これはこれで良いかも。
シリアスな展開で、ノーストレスのゆるゆるアニメが好きな私としては、死人は出てほしくないのですが、 斬られても死なない「うつし」と呼ばれてる術を使ってるので安心です。このまま誰も死なないでくれ、と祈りつつ視聴していこうと思います。

今回は、刀つながりでcutコマンドです。

おそらく使ったことがない-cオプション。何に使うのでしょうか。manコマンドを見ると、-bと-cオプション、似たような説明が書かれています。

takk@deb9:~$ man cut
CUT(1)                         ユーザーコマンド                         CUT(1)

名前
       cut - ファイルの各行から一部分を取り除く
~省略~
       -b, --bytes=LIST
              バイトで数えた LIST を選択する

       -c, --characters=LIST
              文字で数えた LIST を選択する

       -d, --delimiter=DELIM
              フィールドの区切り文字として TAB の代わりに DELIM を使用する
~省略~

こんな時はソースを確認するのが一番早いです。coreutilsにあるので落としてきます。

takk@deb9:~$ apt-get source coreutils
takk@deb9:~$ cd coreutils-8.26

ライセンスを確認する癖をつけるため必ず冒頭部を確認します。まあGNUなので毎回同じなのですが。

takk@deb9:~/coreutils-8.26$ sed '/#inc/Q' src/cut.c
/* cut - remove parts of lines of files
   Copyright (C) 1997-2016 Free Software Foundation, Inc.
   Copyright (C) 1984 David M. Ihnat

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* Written by David Ihnat.  */

/* POSIX changes, bug fixes, long-named options, and cleanup
   by David MacKenzie <djm@gnu.ai.mit.edu>.

   Rewrite cut_fields and cut_bytes -- Jim Meyering.  */

takk@deb9:~/coreutils-8.26$

さっそく-cオプションの使い方を調べます。getoptでオプション解析しているところを見れば良いので、case ‘c’:周辺を抽出します。

takk@deb9:~/coreutils-8.26$ grep 'case.*c.:' -C5 src/cut.c
  while ((optc = getopt_long (argc, argv, "b:c:d:f:nsz", longopts, NULL)) != -1)
    {
      switch (optc)
        {
        case 'b':
        case 'c':
          /* Build the byte list. */
          if (operating_mode != undefined_mode)
            FATAL_ERROR (_("only one type of list may be specified"));
          operating_mode = byte_mode;
          spec_list_string = optarg;
takk@deb9:~/coreutils-8.26$

ズバリ、bオプションと同じですね。何故別のオプションとして用意されているのでしょう。
manの方ではなく、infoの方でコマンドの説明を読んでみます。

takk@deb9:~$ info cut

~省略~

‘-c CHARACTER-LIST’
‘--characters=CHARACTER-LIST’
     Select for printing only the characters in positions listed in
     CHARACTER-LIST.  The same as ‘-b’ for now, but internationalization
     will change that.  Tabs and backspaces are treated like any other
     character; they take up 1 character.  If an output delimiter is
     specified, (see the description of ‘--output-delimiter’), then
     output that string between ranges of selected bytes.

~省略~

どうやらとりあえず-bオプションと同じになってるみたいです。でも、いずれ国際化されたら、本当に文字毎にcutすることができるようになるんでしょうね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA