[데이터 추출 및 가공 03] sed 사용법 s/단어1/단어2/

Home / 데이터 추출과 가공 / [데이터 추출 및 가공 03] sed 사용법 s/단어1/단어2/

sed 사용법 1

curl을 사용해 내려받은 웹페이지는 우리가 웹브라우저에서 보는 내용보다 훨씬 복잡합니다. 우리가 웹브라우저로 보는 웹페이지와는 많이 다릅니다. html에 익숙하지 않은 사람들에겐 무슨 내용이 있는지 모를 수 있을 정도입니다. 그 이유는 <와 >로 둘러쌓인 html tag가 곳곳에 있기 때문입니다. 하지만 이 html tag때문에 우리가 편하게 웹페이지를 볼 수 있기도 합니다. 그 이유는 바로 이 html tag가 알려주는 대로 웹브라우저가 형식을 잘 갖춰 내용을 뷉브라우저 창에 보기좋게 출력하기 때문입니다.

웹 페이지에서 필요한 데이터를 얻고자 하는 사람에게는 이 html tag가 골치 아프기도 하고, 한편으로는 고맙기도 합니다. 제거해야할 대상이기도 하지만, 이게 있어서 중요한 정보를 선택해서 뽑아낼 수 있기 때문입니다. 후자의 한 예로 다른 웹페이지로 연결해주는 링크는 html tag중에 <a href=”…”>에 있습니다. <a href=”..”>라는 tag가 있는 곳을 찾아내면 링크의 정보를 알 수가 있습니다

웹페이지 외에도 다른 텍스트 자료도 상황은 비슷합니다. 애초에 결과를 파일에 저장할때는 중요한 데이터들은 웬만하면 모든 내용을 다 파일에 저장합니다. A에 대한 정보는 a이고, B에 대한 정보는 b이고, … 하는 식으로 데이터를 일단 다 적고 봅니다.

데이터의 일부만 기록했을 경우, 나중에 “아! 이 결과도 필요한데!”하는 상황이 오면 그 결과가 기록된 에이터가 없기때문에 컴퓨터로 다시 똑같은 작업을 돌려야하는 경우가 생깁니다. 금방 끝나는 작업이면 다시 컴퓨터로 돌리면 됩니다. 하지만 공장에서 대형 기계가 돌리는 작업이나 여러개의 CPU 를 써서 여러날 동안 수행한 작업이라면 얘기가 달라집니다. 작업을 다시 수행할 수 없는 경우도 있고, 다시 수행한다해도 다시 하는데 소모되는 시간, 사용 전력, 기계 또는 컴퓨터 마모 등을 고려하면 엄청난 낭비인 경우도 있기때문입니다. 이 때문에 시간과 장비가 많이 들어가는 일은 가능하면 사소해 보이는 결과라도 모두 기록하는 것이 훨씬 경제적일 수도 있습니다.

반면 자료를 분석할때는 자료에 있는 모든 데이터가 필요한 것은 아닙니다. 많은 경우 데이터 일부만 필요하고 나머지 데이타들은 당장 필요하지 않을때가 많습니다. 선택적으로 일부 데이터만 뽑아내야할 필요가 있습니다. 이때 사용할 수 있는 커맨드의 하나가 sed라는 커맨드입니다. sed는 비교적 일관성있게 기록된 자료를 처리할때 유용하게 쓸 수 있습니다. 페턴을 찾아내 바꾸고 하는 작업들을 비교적 간단하게 처리할 수 있기 때문입니다.

이제 본격적으로 sed를 사욯하는 방법을 알아보겠습니다.
터미널(terminal)창을 열고 다음 커맨드를 입력해보겠습니다.

sed 's/1/one/'

그런 다음 아무내용이나 입력하고 Enter를 칩니다. 그러면 같은 내용이 다시 출력됩니다. 하지만 입력한 내용에 숫자 1이 있으면 그 숫자 1은 one으로 바뀌어서 출력됩니다. 입력하는 것을 멈출려면 Ctrl버튼을 누른 상태로 d를 누르면 됩니다. 앞으로 Ctrl+d 를 누른다고 하겠습니다.

위의 커맨드는 1이라는 숫자를 one이라는 단어로 바꿔서 출력합니다. 만약에 sed 다음에 오는 따옴표안에 s/단어1/단어2/ 가 쳐 넣었고 실행한다고 해보죠.

sed 's/단어1/단어2/'

이 커맨드는 입력하는 텍스트에 ‘단어1’이 있으면 ‘단어2’로 바꾸는 작업을 합니다. Ctrl-d 를 누를때까지 이 과정은 반복됩니다.

한 단계 더 나아가 보죠. 아래의 내용을 담은 텍스트 파일 test.txt 을 만듭니다.

I am William.
I am a physicist.
You are Jane.
You are a physicist, too.

vi나 nano를 사용해도 좋고 다른 테스트 에디터를 사용해도 좋습니다. 텍스트 편집기를 사용하는 방법을 모른다면, 다음 커맨드를 입력하고 Enter를 칩니다.

cat > test.txt

그런 다음 파일안에 저장할 위의 4줄 텍스트를 친다음, Ctrl-d (Ctrl키를 누른 상태에서 d키를 누름) 를 누르면 test.txt 이 만들어집니다. ls 커맨드를 실행하면 현재의 디렉토리에 있는 모든 파일의 목록을 볼 수 있습니다. 이 목록에서 test.txt 파일이 있으면 파일이 만들어진거고, 없으면 파일이 만들어지지 않은 겁니다. ls -al 을 실행하면 파일 크기, 파일 만든 날짜 등 파일과 관련된 자세한 내용도 같이 출력됩니다.

이제 William이라는 이름을 여러분의 이름으로 바꾸겠습니다. Gildong이라는 이름으로 바꿔보죠. 그럴려면 다음과 같은 커멘드를 실행해야합니다.

sed 's/William/Gildong/' < test.txt

맨 뒤에 < test.txt 는 키보드로 텍스트를 직접 입력하는 대신 test.txt파일을 읽게 합니다. 이미 만들어 놓은 파일의 내용을 마치 키보드로 입력하는 것처럼 한다는 얘기입니다. 키보드로 텍스트를 입력할때 한줄 한줄 텍스트 처리를 하는 것과 마찬가지로, 파일을 읽어서 sed를 실행할때도 파일 내용을 줄별로 처리합니다.

결과가 어떻게 나올까요?

I am Gildong.
I am a physicist.
You are Jane.
You are a physicist, too.

가 화면에 출력됩니다.

커맨드의 결과를 화면에 출력하지 않고 대신 파일에 저장할 수도 있습니다. 그럴려면 아래와 같이 커맨드를 실행하면 됩니다.

sed 's/Willam/Gildong/' < test.txt > test2.txt

맨 마지막의 > test2.txt는 변환한 결과를 화면에 출력하는 대신 test2.txt에 저장하게 합니다. 화면에는 이 과정이 보이지는 않습니다.  < test.txt 는 test.txt 파일안에 있는 내용을 마치 키보드로 입력하듯이 컴퓨터가 자동으로 입력해주는 것과 비교됩니다.

test2.txt에 저장된 내용을 컴퓨터 화면에서 보려면, 다음 커맨드를 실행하면 됩니다.

cat test2.txt

이제 physicist를 여러분의 직업으로 바꾸겠습니다. 여러분의 직업이 programmer라고 해보죠. physicist를 programmer로 바꾸려면 다음과 같은 커맨드를 실행하면 됩니다. 입력하는 파일을 test2.txt로 하겠습니다.

sed 's/physicst/programmer/' < test2.txt

위의 커맨드를 실행하면

I am Gildong.
I am a programmer.
You are Jane.
You are a programmer, too.

가 화면에 출력됩니다. physicist라고 쓰여 있는 곳이 두 줄인데 두 줄 모두 physicist가 programmer로 바뀌었습니다. 화면에 출력하지 않고 test3.txt에 저장하려면 다음 커맨드를 실행하면 됩니다.

sed 's/physicst/programmer/' < test2.txt > test3.txt

test3.txt 파일에 저장된 내용을 보려면 아래의 커맨드를 실행하면 됩니다.

cat test3.txt