[프로그래밍 이야기 3] 종이 위에서 피어난 텍스트 처리의 지배자들: sed에서 Perl까지
1부에서 awk의 연상 배열과 인 키워드를 다루면서도 마음 한구석에 아쉬움이 남았던 이유는 그보다 앞선 조상인 sed를 언급하지 못했기 때문입니다. 사실 텍스트 처리의 계보를 논할 때 1974년 등장한 sed(Stream Editor)를 빼놓는 것은 뿌리 없는 나무를 이야기하는 것과 같습니다.
화면이 없던 시대의 절실함: sed의 탄생
오늘날 우리는 모니터를 보며 실시간으로 코드를 수정하지만, 1970년대는 라인 프린터가 화면을 대신하던 시대였습니다. 명령을 내리면 종이 뭉치에 결과가 찍혀 나오던 그 시절, 프로그래머들은 파일 전체를 열어볼 메모리 여유도, 종이를 낭비할 여유도 없었습니다.
이 절실함 속에서 데이터를 한 줄씩 흘려보내며 필요한 부분만 정규표현식으로 낚아채고 수정하는 스트림 에디터, sed가 고안되었습니다. sed는 정규표현식을 대중화시킨 최초의 실전 도구였으며, 보이지 않는 곳에서 텍스트를 치환하고 삭제하는 이 방식은 이후 모든 쉘 스크립트의 표준이 되었습니다.
# sed 유산의 형태: 파일 전체를 열지 않고 특정 단어만 교체하여 출력
# 라인 프린터 시절, 종이를 아끼기 위해 필요한 줄만 골라 수정하던 방식
sed 's/OldSystem/NewSystem/g' log_file.txt
도둑질과 복제의 역사: 86-DOS와 MS-DOS
이 텍스트 처리와 쉘의 역사를 이야기할 때 빠질 수 없는 흥미로운 비화가 있습니다. 바로 빌 게이츠와 MS-DOS의 탄생 과정입니다. 1980년대 초, MS는 IBM PC에 탑재할 운영체제가 급히 필요했고 팀 패터슨이 만든 86-DOS를 사들입니다.
재미있는 점은 86-DOS가 당시 업계 표준이었던 CP/M을 철저히 벤치마킹한 결과물이었다는 것입니다. CP/M의 명령어 구조와 텍스트 처리 방식은 유닉스의 철학을 기묘하게 복제한 형태였습니다. 결국 MS가 유닉스의 강력한 파이프(|)와 리다이렉션(>) 개념을 DOS에 가져온 것은, 70년대 유닉스 거인들이 정립한 텍스트 처리 방식의 우수성을 인정한 셈이었습니다.
Tcl: 단순한 문자열을 넘어 자동화의 표준으로
80년대 후반 등장한 Tcl(Tool Command Language)은 모든 것은 문자열이다라는 철학으로 텍스트 처리의 지평을 넓혔습니다. 특히 2000년대 초반 통신 붐 시대에 Tcl의 확장 도구인 expect는 혁명적이었습니다. 대화형 인터페이스를 사람이 직접 타이핑하는 대신, 스크립트가 텍스트를 읽고 자동으로 응답하게 만들었기 때문입니다.
# expect 유산의 형태: 원격 장비(Telnet) 자동 접속 제어
# 스크립트가 "login:"이라는 텍스트가 나오길 기다렸다가(expect) 아이디를 보냄(send)
spawn telnet 192.168.0.1
expect "login:"
send "admin\r"
expect "password:"
send "1234\r"
interact
이 방식은 오늘날 반도체 설계(HDL) 공정이나 대규모 서버 인프라 제어의 시초가 되었습니다.
Perl의 전성기: 유전자(Bio)와 인터넷(Web)의 텍스트를 지배하다
1987년 래리 월이 내놓은 Perl은 텍스트 처리의 끝판왕이었습니다. 90년대에 이르러 인류가 직면한 가장 거대한 두 가지 텍스트 데이터를 정복하며 절대 군주로 등극합니다.
첫 번째는 웹(Web)이었습니다. 당시 인터넷은 지금처럼 화려한 앱이 아닌, 단순히 텍스트를 주고받는 공간이었습니다. 사용자로부터 입력받은 텍스트를 처리해 동적인 결과를 내놓는 CGI(Common Gateway Interface)의 표준 언어가 바로 Perl이었습니다. 게시판, 방명록, 초기 전자상거래 사이트 등 초기 웹의 모든 뒷모습은 Perl이 텍스트를 쪼개고 합치며 만들어낸 결과물이었습니다.
# Perl 유산의 형태: CGI 환경에서 텍스트 기반 웹 응답 생성
# 90년대 웹을 지배했던 전형적인 텍스트 처리 방식
print "Content-type: text/html\n\n";
print "<html><body>";
$user_input = <STDIN>; # 텍스트 데이터 입력
if ($user_input =~ /TATA[AT]A[AT]/) { # 정규식으로 유전자 패턴 검색
print "염기서열 패턴 발견!";
}
print "</body></html>";
두 번째는 생명공학(Bio)이었습니다. 거대한 텍스트 덩어리인 유전자 염기서열을 빠르게 검색하고 분석하기 위해 탄생한 BioPerl은 당시 바이오인포매틱스의 표준이었습니다. 수조 개의 염기서열 정보에서 특정 패턴을 찾아내 인류의 비밀을 파헤치던 시절, Perl은 과학자들에게 가장 강력한 현미경이었습니다.
# Perl 유산의 형태: CGI 환경에서 텍스트 기반 웹 응답 생성
# 90년대 웹을 지배했던 전형적인 텍스트 처리 방식
print "Content-type: text/html\n\n";
print "<html><body>";
$user_input = <STDIN>; # 텍스트 데이터 입력
if ($user_input =~ /TATA[AT]A[AT]/) { # 정규식으로 유전자 패턴 검색
print "염기서열 패턴 발견!";
}
print "</body></html>";유산을 남기고 떠난 거인: 쇠퇴와 세대교체
하지만 Perl의 강력한 텍스트 처리 능력은 역설적으로 쇠퇴의 원인이 되었습니다. Perl은 자신의 심장과도 같았던 정규표현식 문법을 PCRE(Perl Compatible Regular Expressions)라는 이름으로 모든 현대 언어에게 유산으로 나눠주었습니다. 이제 Python, Java, Rust는 물론이고 웹의 새로운 지배자가 된 JavaScript에서도 Perl의 정규식을 쓸 수 있게 되었습니다.
웹 환경이 단순한 텍스트 교환을 넘어 복잡한 객체 지향과 대규모 아키텍처를 요구하면서, Perl 특유의 난해한 문법(Write-once, Read-never)은 유지보수의 걸림돌이 되었습니다. 결국 생명공학의 주도권은 BioPython으로, 웹의 주도권은 PHP를 거쳐 Python(Django/Flask)과 JavaScript(Node.js)로 넘어갔습니다.
Perl이 닦아놓은 텍스트 처리 알고리즘과 정규식의 유산을 고스란히 품은 채, 새로운 세대의 언어들이 그 자리를 대신하게 된 것입니다. 거인은 주류에서 물러났지만, 그가 남긴 정규식이라는 세포는 오늘날 우리가 웹브라우저에서 검색창에 단어 하나를 칠 때마다 그 혈관 속에서 살아 숨 쉬고 있습니다.
댓글
댓글 쓰기