2010. 12. 7. 12:48

Linux/Ubuntu에서 sed와 tr을 이용하여 text 바꾸기(replace)


sed 사용하기

file에서 text를 찾는 것은 text를 바꾸기 위한 첫번째 과정입니다. text의 stream을 편집하는건 sed 명령으로 이뤄집니다. sed 명령은 완전한 script language 입니다. 여기에서는 sed 명령으로 기초적인 text를 바꾸는 방법에 대해 알아봅니다.

vi를 통해 text를 바꾸는데 익숙하다면, sed는 보다 친숙할 것입니다. 다음의 예에서 모든 줄에서 처음으로 발견된 abc를 123으로 변경하는 예제 입니다. sed는 pipe로 입력받아 stdout으로 출력합니다(즉, 화면).

$ cat myfile.txt | sed s/abc/123/

교체된 줄의 끝에 g를 추가하고 싶다면, 다음과 같이 하면 됩니다. 이는 abc를 123으로 변경하는 모든 경우에 대해 적용됩니다. 이 예에서는 myfile.txt를 입력받아 mynewfile.txt로 출력합니다.

$ sed s/abc/123/g < myfile.txt > mynewfile.txt

다음 예제는 /etc/passwd 파일에서 처음으로 발견된 /home/greenfish를 /home2/greenfish로 변경하는 방법을 알려줍니다(물론, 해당 파일을 변경하지 않고, 변경된 text를 보여지기만 합니다). 이것은 사용자 계정을 다른 directory에 이주시키는데 유용하게 사용됩니다. '와 \를 이용하여 /를 구분자(delimiter)로 사용하지 말것을 알려줍니다.

$ sed 's/\/home\/greenfish/\/home2\/greenfish/g' < /etc/passwd

비록 /이 sed 명령의 구분자로 사용되지만, 사용자가 직접 변경할 수 있습니다. 구분자를 변경하는 것은 관련 문장에 \가 포함되는 경우 보다 편리하게 사용됩니다. 예를들어, 앞의 명령과 같이 경로가 포함된 경우에는, 아래와 같이 구분자를 변경하여 사용할 수 있습니다.

$ sed 's-/home/greenfish/-/home2/greenfish/-' < /etc/passwd
$ sed 'sD/home/greenfish/D/home2/greenfish/D' < /etc/passwd


첫번째 줄에서 보여진대로 -가 구분자로 사용되었습니다. 다음줄에서는 D가 사용되었습니다.

sed 명령은 한번에 여러개를 동시에 교체할 수 있으며, 각각 -e에 의해 진행됩니다. 아래와 같이 myfile.txt stream으로 부터 모든 발견된 greenfish에 대해 GREENFISH로 변경하고, abc를 ABC로 역시 변경합니다.

$ sed -e s/francois/FRANCOIS/g -e s/chris/CHRIS/g < myfile.txt

sed로 text stream으로 부터 new line 문자를 추가하는데 사용할 수 있습니다.
$ echo aaabccc | sed 's/b/\
> /'
aaa
ccc
물론, new line 문자를 변경하는데는 tr 명령이 좀더 편리하게 사용됩니다.


tr을 사용하여 문자 변환(translating)과 삭제하기

tr 명령은 그때 그때 대충 봐 가면서 동작하는 간단한 문자 변환기 입니다. 다음의 예는 new line 문자들은 space로 변경되어 현재 directory로 부터 나열된 파일들은 한줄로 표현됩니다.

$ ls | tr '\n' ' '
Desktop Documents Downloads errors.txt ...

tr 명령은 한 문자를 다른 문자로 변환하는데 사용되나 sed 명령 처럼 문자열은 지원되지 않습니다. 다음은 소문자 f를 대문자 F로 변경합니다.

$ tr f F < myfile.txt

또한 tr 명령은 -d를 사용하여 문자열을 삭제할 수 있습니다.

$ ls | tr -d '\n'
$ ls -d f < myfile.txt


tr 명령은 작업할 문자열의 범위를 지정할 수 있습니다. 아래는 소문자를 대문자로 변경하는 예를 보여줍니다.

$ echo greenfish | tr a-z A-Z
GREENFISH

다음은 위와 똑같은 효과를 줍니다.

$ echo greenfish | tr '[:lower:]' '[:upper:]'