GREP 명령어 만들기 및 정규표현식

이동욱

2021/08/01

Categories: 시스템 프로그래밍 Tags: 시스템 프로그래밍

GREP 명령어 만들기 및 정규 표현식


#include <sys/types.h>
#include <regex.h>

int recomp(regex_t *reg, const char *pattern, int flags);
void regfree(regex_t *reg);
int regexec(const regex_t *reg, const char *string, size_t nmatch, regmatch_t pmatch[], int flags);
size_t regerror(int errcode, const regex_t *reg, char *msgbuf, size_t msgbuf_size);

grep 소스 코드


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>

static void do_grep(regex_t *pat, FILE *f);

int main(int argc, char *argv[]) {
  regex_t pat;
  int err;
  int i;

  if (argc < 2) {
    fputs("no pattern\n", stderr);
    exit(1);
  }
  err = regcomp(&pat, argv[1], REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
  if (err != 0) {
    char buf[1024];
    puts(buf);
    exit(1);
  }
  if (argc == 2) {
    do_grep(&pat, stdin);
  } else {
    for (i = 2; i < argc; i++) {
      FILE *f;

      f = fopen(argv[i], "r");
      if (!f) {
        perror(argv[i]);
        exit(1);
      }
      do_grep(&pat, f);
      fclose(f);
    }
  }
  regfree(&pat);
  exit(0);
}

static void do_grep(regex_t *pat, FILE *src) {
  char buf[4096];

  while (fgets(buf, sizeof buf, src)) {
    if (regexec(pat, buf, 0, NULL, 0) == 0) {
      fputs(buf, stdout);
    }
  }
}

한글 문자열 처리와 국제화


유니코드


문자 코드의 구체적인 의미


  1. 부호화 문자집합
  2. 인코딩

부호화 문자 집합


인코딩


  1. 모든 문자에 대해서 같은 바이트 수를 사용하는 인코딩
  2. 문자의 종류에 따라 사용하는 바이트 수를 바꾸는 인코딩

문자열 처리 방법


  1. 프로그램에서 사용할 문자 코드를 미리 정한다 (혹은 사용자가 정하도록 한다)
  2. 문자 코드를 추출한다.
  3. 문자열을 주고 받을 때, 문자 코드의 이름도 넘기도록 한다.

결로넉으로 완벽한 대처는 존재하기 힘들고, 가장 합리적인 방법은 사용할 문자 코드를 미리 정하고, 그 이외의 문자 코드는 이름을 넘겨줘서 처리할 수 있도록 대응하는 방법일 것이다.

국제화와 다중언어화


다중언어 처리와 국제화를 위한 라이브러리


국제화와 다중 언어 문자열 처리에 사용할 수 있는 라이브러리 몇 가지를 소개한다.

libc 로케일 매커니즘

libc 와이드 문자 관련 루틴(wchar)

iconv

PCRE(Perl Compatible Regular Expression)

참고 문헌

>> Home