grepを読む(その7)

続きです。

前回のgrep結果。

takk@deb9:~/tmp/grep-3.1/src$ grep "case.*'.'" grep.c | grep -v 'case.*case'
  {"ignore-case", no_argument, NULL, 'i'},
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case 'E':
      case 'F':
      case 'P':
      case 'G':
      case 'X': /* undocumented on purpose */
      case 'H':
      case 'I':
      case 'T':
      case 'U':
      case 'u':
      case 'V':
      case 'a':
      case 'b':
      case 'c':
      case 'd':
      case 'e':
      case 'f':
      case 'h':
      case 'i':
      case 'y':                 /* For old-timers . . . */
      case 'L':
      case 'l':
      case 'm':
      case 'n':
      case 'o':
      case 'q':
      case 'R':
      case 'r':
      case 's':
      case 'v':
      case 'w':
      case 'x':
      case 'Z':
      case 'z':
takk@deb9:~/tmp/grep-3.1/src$

ここから行番号を取得して、ファイルに落とします。

takk@deb9:~/tmp/grep-3.1/src$ grep -n "case.*'.'" grep.c | grep -v 'case.*case' | cut -d: -f1 > filter
takk@deb9:~/tmp/grep-3.1/src$

このような行番号の一覧ができました。

takk@deb9:~/tmp/grep-3.1/src$ head filter
460
2465
2469
2473
2479
2488
2492
2496
2500
2504
takk@deb9:~/tmp/grep-3.1/src$

正規表現で先頭で検索できるように修正。

takk@deb9:~/tmp/grep-3.1/src$ sed 's/^/\^/' -i filter
takk@deb9:~/tmp/grep-3.1/src$

このファイルをgrepに適用します。

takk@deb9:~/tmp/grep-3.1/src$ head filter
^460
^2465
^2469
^2473
^2479
^2488
^2492
^2496
^2500
^2504
takk@deb9:~/tmp/grep-3.1/src$

nlでgrep.cの行頭に行番号を付与してから、 grepでさきほど作成したfilterで抽出します。

takk@deb9:~/tmp/grep-3.1/src$ nl -ba -nln grep.c | grep -A1 -f filter
460       {"ignore-case", no_argument, NULL, 'i'},
461       {"initial-tab", no_argument, NULL, 'T'},
--
2465          case 'A':
2466            context_length_arg (optarg, &out_after);
--
2469          case 'B':
2470            context_length_arg (optarg, &out_before);
--
2473          case 'C':
2474            /* Set output match context, but let any explicit leading or
--
2479          case 'D':
2480            if (STREQ (optarg, "read"))
--
2488          case 'E':
2489            matcher = setmatcher ("egrep", matcher);
--
2492          case 'F':
2493            matcher = setmatcher ("fgrep", matcher);
--
2496          case 'P':
2497            matcher = setmatcher ("perl", matcher);
--
2500          case 'G':
2501            matcher = setmatcher ("grep", matcher);
--
2504          case 'X': /* undocumented on purpose */
2505            matcher = setmatcher (optarg, matcher);
--
2508          case 'H':
2509            with_filenames = true;
--
2513          case 'I':
2514            binary_files = WITHOUT_MATCH_BINARY_FILES;
--
2517          case 'T':
2518            align_tabs = true;
--
2521          case 'U':
2522            if (O_BINARY)
--
2526          case 'u':
2527            /* Obsolete option; it has no effect.  FIXME: Diagnose use of
--
2531          case 'V':
2532            show_version = true;
--
2535          case 'a':
2536            binary_files = TEXT_BINARY_FILES;
--
2539          case 'b':
2540            out_byte = true;
--
2543          case 'c':
2544            count_matches = true;
--
2547          case 'd':
2548            directories = XARGMATCH ("--directories", optarg,
--
2554          case 'e':
2555            cc = strlen (optarg);
--
2568          case 'f':
2569            if (STREQ (optarg, "-"))
--
2601          case 'h':
2602            with_filenames = false;
--
2606          case 'i':
2607          case 'y':                 /* For old-timers . . . */
2608            match_icase = true;
--
2611          case 'L':
2612            /* Like -l, except list files that don't contain matches.
--
2617          case 'l':
2618            list_files = LISTFILES_MATCHING;
--
2621          case 'm':
2622            switch (xstrtoimax (optarg, 0, 10, &max_count, ""))
--
2633          case 'n':
2634            out_line = true;
--
2637          case 'o':
2638            only_matching = true;
--
2641          case 'q':
2642            exit_on_match = true;
--
2646          case 'R':
2647            fts_options = basic_fts_options | FTS_LOGICAL;
--
2649          case 'r':
2650            directories = RECURSE_DIRECTORIES;
--
2654          case 's':
2655            suppress_errors = true;
--
2658          case 'v':
2659            out_invert = true;
--
2662          case 'w':
2663            wordinit ();
--
2667          case 'x':
2668            match_lines = true;
--
2671          case 'Z':
2672            filename_mask = 0;
--
2675          case 'z':
2676            eolbyte = '\0';
takk@deb9:~/tmp/grep-3.1/src$

460,461行目はcase文ではなかったので、どこかで条件を間違えたのでしょう。

つづく

Leave a Reply

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

CAPTCHA