안녕하세요. 코딩개입니다. 문자열을 다룰 일은 생각보다 많은데요. 리눅스에서 tr 명령어도 꽤 유용하게 쓰입니다. 간단하게 예제를 보면서 알아보도록 할게요.

 

 tr은 translate 혹은 delete character라고 합니다. 문자들을 지우거나, 다른 것으로 바꾸는 것인가 봅니다. 사실 저는 translate를 번역하다라는 뜻만 있는 줄 알았는데, 그게 아닌가 봅니다?

 

 

 몇 가지 옵션들이 있는데요. -c는 complement를 의미합니다. 보수 할 때 많이 들어보셨을 텐데요. 반전을 의미합니다. 예를 들어 세트 1이 digit라고 해 봅시다. digit의 반전은 무엇인가요? digit이 아닌 것들이 됩니다. 예를 들자면 'a', 'b', ' ' 등이 이 집합에 속합니다. 다음에 -s는 여러 번 연속해서 나오는 캐릭터를 한 번만 나오게 해요. 예를 들어 공백 여러 개가 연속되어 있는 것을 공백 한 개로 바꿀 때 쓰겠네요.

 


 예제를 몇 개 보겠습니다. translate가 번역하다라는 뜻도 있지만, 바뀌다라는 뜻도 있다고 했어요.

 

 tr '[:lower:]' '[:upper:]' 를 적어주었는데요. 이는 소문자가 대문자로 바뀌는 것을 의미해요. echo abcd라고 하면 "abcd"가 출력될 텐데요. 모두 소문자로 출력되었어요. 이걸 대문자로 바꾸면 "ABCD"가 됩니다.

 

 

 다음에 -d를 보면 삭제라고 되어 있어요. " "니까 공백을 삭제하는 건데요. echo 명령어에서 maple과 story는 공백 여러 개로 구분되어 있어요. 이들을 모두 삭제하는 것이므로 "maplestory"가 출력되어요.

 

 

 이제, "maple 200 story"에서 digit만 삭제하려면 어떻게 해야 할까요? -d 옵션을 주고 '[:digit:]'을 set1에 넣어주면 됩니다. 그러면, 숫자들은 모두 제거되게 됩니다.

 

 

 반면, 숫자만 남기고 나머지는 모두 삭제하려면 어떻게 해야 할까요? 숫자가 아닌 것을 모두 지워야 하므로, -dc 옵션을 줍니다. 다음에 set1에 '[:digit:]'를 적어줍니다. 그러면, 수가 아닌 집합에 속하는 문자들을 delete 하게 됩니다. "maple 200 sto30ry"에서 이 연산을 적용하게 되면 "20030"만 남게 됩니다.

 

 

 다음에, -s 옵션은 압축을 의미한다고 했어요. 뉘앙스가 다른가요? 적합한 단어를 모르겠는데요. maple과 story가 공백 여러 개로 구분되어 있었어요. 그런데 -s 옵션을 주고 set1에 " "을 넣었어요. 그랬더니 연속적인 공백 여러개가 공백 하나로 줄어버렸음을 알 수 있어요.

 

 


 이제 문자열에 숨어있는 수 중에 첫 번째 수를 뽑고 싶어요. 어떻게 하면 좋을까요? 예를 들어, 문자열이 "maple 200 sto30ry"였다고 해 봅시다. 여기에 숨어있는 수 중 첫 번째는 200이고 두 번째는 30입니다. 저는 200을 뽑고 싶어요. 그럴려면 먼저 문자열을 적당히 가공 처리를 해야 하는데요. digit이 아닌 얘들은 모두 공백으로 치환합시다.

 

 그럴려면 -c 옵션을 주면 됩니다. 다음에, 연속된 공백을 하나의 공백으로 만들어 버립시다.

 

 

 조금 더 깔끔하게 바뀌었어요. 이제, awk 등으로 뽑아버리면 됩니다.

 

 200이 깔끔하게 나오네요.