IT일반/Linux

Command Line - 텍스트 편집

버섯도리 2022. 6. 1. 17:52
[cmd_test@btjeon-naver ~]$ cat > foo.txt
	The quick brown fox jumped over the lazy dog.
[cmd_test@btjeon-naver ~]$ cat -A foo.txt
^IThe quick brown fox jumped over the lazy dog.    $

cat 명령어의 -A 옵션은 텍스트 내의 비출력 문자를 표시한다.

(^I는 탭 문자를, $는 공백을 의미한다.)

(캐리지 리턴값을 색출하는 데 유용하게 사용할 수 있다.)

 

[cmd_test@btjeon-naver ~]$ cat > foo.txt
The quick brown fox



jumped over the lazy dog.
[cmd_test@btjeon-naver ~]$ 
[cmd_test@btjeon-naver ~]$ 
[cmd_test@btjeon-naver ~]$ cat -ns foo.txt
     1	The quick brown fox
     2	
     3	jumped over the lazy dog.

-n 옵션은 줄 번호를 매기고 -s는 여러 공백 줄을 제거하는 옵션이다.

 

[cmd_test@btjeon-naver ~]$ sort > foo.txt
c
b
a
[cmd_test@btjeon-naver ~]$ cat foo.txt
a
b
c

sort 명령어는 표준 입력이나 커맨드라인에 명시된 하나 이상의 파일의 내용물들을 정렬하고 표준 출력으로 결과를 전달한다.

다음과 같이 여러 개의 파일을 전부 합쳐 정렬된 형태의 파일로 만들 수 있다.

sort file1.txt file2.txt file3.txt > final_sorted_list.txt

 

<sort 주요 옵션>

옵션 Long 옵션 설명
-b --ignore-leading-blanks 기본적으로 정렬은 각 줄의 첫 문자를 대상으로 전체에 실행한다. 이 옵션은 각 줄의 첫 공백들은 무시하고 공백이 아닌 첫 문자를 기준으로 정렬한다.
-f --ignore-case 정렬 시에 대소문자를 구분하지 않도록 한다.
-n --numeric-sort 이 옵션을 사용하면 알파벳 대신 수치를 기준으로 정렬한다.
-r --reverse 역순(내림차순)으로 정렬한다.
-k --key=field1[,field2] 필드 전체가 아닌 키 필드로 지정된 field1부터 field2까지를 기준으로 정렬한다.
-m --merge 복수의 파일을 추가적인 정렬 없이 하나의 정렬된 결과로 합친다.
-o --output=file 정렬된 결과를 표준 출력이 아닌 file로 보낸다.
-t --field-separator=char 필드 구분 문자를 정의한다. 기본적으로 스페이스나 탭으로 필드를 구분한다.

 

[cmd_test@btjeon-naver ~]$ du -s /usr/share/* | sort -nr | head
du: cannot read directory ‘/usr/share/polkit-1/rules.d’: Permission denied
113948	/usr/share/locale
79128	/usr/share/doc
43340	/usr/share/man
25224	/usr/share/vim
20356	/usr/share/perl5
18828	/usr/share/backgrounds
9704	/usr/share/i18n
9248	/usr/share/systemtap
9192	/usr/share/cracklib
7664	/usr/share/hwdata

디스크 사용량이 많은 경로명을 상위 10개로 보여준다. 

 

[cmd_test@btjeon-naver ~]$ ls -l /usr/bin | sort -nr -k 5 | head
-rwxr-xr-x.   1 root root    8885520 Apr  1  2020 doxygen
-rwxr-xr-x.   1 root root    6826328 Apr  1  2020 gdb
-rwxr-xr-x.   1 root root    5354192 May 13  2020 ld.gold
-rwxr-xr-x.   1 root root    3555792 Apr  1  2020 stap
-rwxr-xr-x.   1 root root    3177968 May 13  2020 dwp
-rwxr-xr-x.   1 root root    2337192 Aug  9  2019 vim
-rwxr-xr-x.   1 root root    1558072 Aug  7  2020 systemd-analyze
-rwxr-xr-x. 113 root root    1527752 May 29  2020 git-upload-archive
-rwxr-xr-x. 113 root root    1527752 May 29  2020 git-receive-pack
-rwxr-xr-x. 113 root root    1527752 May 29  2020 git

파일 크기의 역순으로 상위 10개로 보여준다. (-k 5 옵션은 5번째 필드를 정렬키로 지정한다.)

 

SUSE      10.2      12/07/2006
Fedora    10        11/25/2008
SUSE      11.0      06/19/2008
Ubuntu    8.04      04/24/2008
Fedora    8         11/08/2007
SUSE      10.3      10/04/2007
Ubuntu    6.10      10/26/2006
Fedora    7         05/31/2007
Ubuntu    7.10      10/18/2007
Ubuntu    7.04      04/19/2007
SUSE      10.1      05/11/2006
Fedora    6         10/24/2006
Fedora    9         05/13/2008
Ubuntu    6.06      06/01/2006
Ubuntu    8.10      10/30/2008
Fedora    5         03/20/2006

distos.txt

 

[cmd_test@btjeon-naver ~]$ sort distos.txt 
Fedora    10        11/25/2008
Fedora    5         03/20/2006
Fedora    6         10/24/2006
Fedora    7         05/31/2007
Fedora    8         11/08/2007
Fedora    9         05/13/2008
SUSE      10.1      05/11/2006
SUSE      10.2      12/07/2006
SUSE      10.3      10/04/2007
SUSE      11.0      06/19/2008
Ubuntu    6.06      06/01/2006
Ubuntu    6.10      10/26/2006
Ubuntu    7.04      04/19/2007
Ubuntu    7.10      10/18/2007
Ubuntu    8.04      04/24/2008
Ubuntu    8.10      10/30/2008

Fedora 10 버전이 맨 위로 올라가서 정렬되었다.

 

[cmd_test@btjeon-naver ~]$ sort --key=1,1 --key=2n distos.txt 
Fedora    5         03/20/2006
Fedora    6         10/24/2006
Fedora    7         05/31/2007
Fedora    8         11/08/2007
Fedora    9         05/13/2008
Fedora    10        11/25/2008
SUSE      10.1      05/11/2006
SUSE      10.2      12/07/2006
SUSE      10.3      10/04/2007
SUSE      11.0      06/19/2008
Ubuntu    6.06      06/01/2006
Ubuntu    6.10      10/26/2006
Ubuntu    7.04      04/19/2007
Ubuntu    7.10      10/18/2007
Ubuntu    8.04      04/24/2008
Ubuntu    8.10      10/30/2008

배포판 이름, 버전 번호 순으로 정렬

(key=1,1 --> 1번 필드로 시작해서 1번으로 끝남. key=2n --> 1번 필드가 정렬 키이고 숫자값 정렬.)

 

[cmd_test@btjeon-naver ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distos.txt 
Fedora    10        11/25/2008
Ubuntu    8.10      10/30/2008
SUSE      11.0      06/19/2008
Fedora    9         05/13/2008
Ubuntu    8.04      04/24/2008
Fedora    8         11/08/2007
Ubuntu    7.10      10/18/2007
SUSE      10.3      10/04/2007
Fedora    7         05/31/2007
Ubuntu    7.04      04/19/2007
SUSE      10.2      12/07/2006
Ubuntu    6.10      10/26/2006
Fedora    6         10/24/2006
Ubuntu    6.06      06/01/2006
SUSE      10.1      05/11/2006
Fedora    5         03/20/2006

날짜 역순으로 정렬

(k 3,7 --> 3번 필드의 7번째 문자에서 시작하는 정렬 키 사용)

 

[cmd_test@btjeon-naver ~]$ sort -t ':' -k 7 /etc/passwd | head
cmd_test:x:1001:1001::/home/cmd_test:/bin/bash
nbpmon:x:1000:1000:agent-account:/home1/nbpmon:/bin/bash
root:x:0:0:root:/root:/bin/bash
abrt:x:173:173::/etc/abrt:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

passwd 파일의 7번째 필드(사용자 기본 쉘)을 기준으로 정렬 (t 옵션으로 구분자 지정)

 

[cmd_test@btjeon-naver ~]$ cat > foo.txt
a
b
c
a
b
c
[cmd_test@btjeon-naver ~]$ uniq foo.txt
a
b
c
a
b
c
[cmd_test@btjeon-naver ~]$ sort foo.txt | uniq
a
b
c

uniq 명령어를 통해 중복을 제거할 수 있는데, sort 등으로 먼저 입력 내용을 정렬해야 한다.

 

<uniq 주요 옵션>

옵션 설명
-c 중복 발생 횟수와 함께 중복 행의 목록을 출력한다.
-d 유일한 행이 아닌 중복된 행들만을 출력한다.
-f n 각 행의 n개의 필드까지 무시한다. (sort와 달리 uniq는 구분자를 설정하는 옵션이 없다.)
-i 행 비교시 대소문자 구별을 하지 않는다.
-s n 각 행의 n개의 문자까지 무시한다.
-u 유일한 행들만 출력한다. (기본값)

 

[cmd_test@btjeon-naver ~]$ sort foo.txt | uniq -c
      2 a
      2 b
      2 c

중복 발생 횟수를 같이 출력한다.

 

<cut 선택 옵션>

옵션 설명
-c char_list char_list에 정의된 영역을 추출한다. 이 목록은 하나 이상의 콤마로 구분된 글자 범위다.
-f field_list field_list에 정의된 하나 이상의 필드를 추출한다. 이 목록은 하나 이상의 콤마로 구분된 필드 범위다.
-d delim_char -f로 지정했을 때 delim_char를 필드 구분자로 사용한다. 기본적으로 필드들은 하나의 탭문자로 구분되어야 한다.
--complement -c 또는 -f로 명시된 영역을 제외한 모든 부분을 추출한다.

 

[cmd_test@btjeon-naver ~]$ cat -A distos.txt 
SUSE^I10.2^I12/07/2006$
Fedora^I10^I11/25/2008$
SUSE^I11.0^I06/19/2008$
Ubuntu^I8.04^I04/24/2008$
Fedora^I8^I11/08/2007$
SUSE^I10.3^I10/04/2007$
Ubuntu^I6.10^I10/26/2006$
Fedora^I7^I05/31/2007$
Ubuntu^I7.10^I10/18/2007$
Ubuntu^I7.04^I04/19/2007$
SUSE^I10.1^I05/11/2006$
Fedora^I6^I10/24/2006$
Fedora^I9^I05/13/2008$
Ubuntu^I6.06^I06/01/2006$
Ubuntu^I8.10^I10/30/2008$
Fedora^I5^I03/20/2006$

탭 구분자 확인

 

[cmd_test@btjeon-naver ~]$ cut -f 3 distos.txt 
12/07/2006
11/25/2008
06/19/2008
04/24/2008
11/08/2007
10/04/2007
10/26/2006
05/31/2007
10/18/2007
04/19/2007
05/11/2006
10/24/2006
05/13/2008
06/01/2006
10/30/2008
03/20/2006

cut 명령어를 통해 3번째 필드를 추출한다.

 

[cmd_test@btjeon-naver ~]$ cut -f 3 distos.txt | cut -c 7-10
2006
2008
2008
2008
2007
2007
2006
2007
2007
2007
2006
2006
2008
2006
2008
2006

3번째 필드의 년도 추출

 

[cmd_test@btjeon-naver ~]$ cut -d ':' -f 1 /etc/passwd | head
root
bin
mail
nobody
systemd-network
dbus
polkitd
sshd
postfix
rpc

다른 필드 구분자를 지정해서 추출

 

[cmd_test@btjeon-naver ~]$ expand distos.txt | cut -c 23-
2006
2008
2008
2008
2007
2007
2006
2007
2007
2007
2006
2006
2008
2006
2008
2006

expand 명령어는 탭문자를 공백 문자로 치환한다. unexpand는 공백 문자를 탭문자로 치환하는 기능을 제공한다.

 

[cmd_test@btjeon-naver ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distos.txt > distros-bydate.txt
[cmd_test@btjeon-naver ~]$ cut -f 1,2 distros-bydate.txt > distros-versions.txt
[cmd_test@btjeon-naver ~]$ head distros-versions.txt 
Fedora	10
Ubuntu	8.10
SUSE	11.0
Fedora	9
Ubuntu	8.04
Fedora	8
Ubuntu	7.10
SUSE	10.3
Fedora	7
Ubuntu	7.04
[cmd_test@btjeon-naver ~]$ cut -f 3 distros-bydate.txt > distros-dates.txt
[cmd_test@btjeon-naver ~]$ head distros-dates.txt 
11/25/2008
10/30/2008
06/19/2008
05/13/2008
04/24/2008
11/08/2007
10/18/2007
10/04/2007
05/31/2007
04/19/2007

paste 테스트 준비...

 

[cmd_test@btjeon-naver ~]$ paste distros-dates.txt distros-versions.txt 
11/25/2008	Fedora	10
10/30/2008	Ubuntu	8.10
06/19/2008	SUSE	11.0
05/13/2008	Fedora	9
04/24/2008	Ubuntu	8.04
11/08/2007	Fedora	8
10/18/2007	Ubuntu	7.10
10/04/2007	SUSE	10.3
05/31/2007	Fedora	7
04/19/2007	Ubuntu	7.04
12/07/2006	SUSE	10.2
10/26/2006	Ubuntu	6.10
10/24/2006	Fedora	6
06/01/2006	Ubuntu	6.06
05/11/2006	SUSE	10.1
03/20/2006	Fedora	5

paste 명령어는 하나 이상의 텍스트 열을 추가한다.

 

[cmd_test@btjeon-naver ~]$ cut -f 1,1 distros-bydate.txt > distros-names.txt
[cmd_test@btjeon-naver ~]$ paste distros-dates.txt distros-names.txt > distros-key-names.txt
[cmd_test@btjeon-naver ~]$ head distros-key-names.txt 
11/25/2008	Fedora
10/30/2008	Ubuntu
06/19/2008	SUSE
05/13/2008	Fedora
04/24/2008	Ubuntu
11/08/2007	Fedora
10/18/2007	Ubuntu
10/04/2007	SUSE
05/31/2007	Fedora
04/19/2007	Ubuntu
[cmd_test@btjeon-naver ~]$ cut -f 2,2 distros-bydate.txt > distros-vernums.txt
[cmd_test@btjeon-naver ~]$ paste distros-dates.txt distros-vernums.txt > distros-key-vernums.txt
[cmd_test@btjeon-naver ~]$ head distros-key-vernums.txt 
11/25/2008	10
10/30/2008	8.10
06/19/2008	11.0
05/13/2008	9
04/24/2008	8.04
11/08/2007	8
10/18/2007	7.10
10/04/2007	10.3
05/31/2007	7
04/19/2007	7.04

join 테스트 준비...

 

[cmd_test@btjeon-naver ~]$ join distros-key-names.txt distros-key-vernums.txt | head
11/25/2008 Fedora 10
10/30/2008 Ubuntu 8.10
06/19/2008 SUSE 11.0
05/13/2008 Fedora 9
04/24/2008 Ubuntu 8.04
11/08/2007 Fedora 8
10/18/2007 Ubuntu 7.10
10/04/2007 SUSE 10.3
05/31/2007 Fedora 7
04/19/2007 Ubuntu 7.04

join 명령어는 특정 키 필드를 기준으로 복수의 파일을 합쳐서 가져온다. (RDBMS join 형태)

join이 제대로 동작하려면 파일들이 키 필드를 기준으로 정렬되어 있는 것이 중요하다.

또한 기본적으로 입력 필드 구분자로 공백문자를 사용하고 출력 필드 구분자로 하나의 공백을 사용한다.

(옵션을 통해 변경 가능)

 

[cmd_test@btjeon-naver ~]$ cat > file1.txt
a
b
c
d
[cmd_test@btjeon-naver ~]$ cat > file2.txt
b
c
d
e
[cmd_test@btjeon-naver ~]$ comm file1.txt file2.txt 
a
		b
		c
		d
	e

comm 명령어는 두 텍스트 파일을 비교하여 각각 유일한 행과 공통된 행들을 표시한다.

1번째 열 : 1번째 파일의 유일한 행

2번째 열 : 2번째 파일의 유일한 행

3번째 열 : 두 파일의 공통된 행

 

[cmd_test@btjeon-naver ~]$ comm -12 file1.txt file2.txt 
b
c
d

-n(숫자) 옵션으로 제거할 열을 지정할 수 있다.

 

[cmd_test@btjeon-naver ~]$ diff file1.txt file2.txt 
1d0
< a
4a4
> e

diff 명령어로 행 단위로 비교할 수 있으며, 기본 포맷으로 출력하게 된다.

기본적인 출력 포맷은 첫 번째 파일에서 두 번째 파일로 변환된 위치와 형태에 대해 설명한다.

 

<diff 변경 명령>

변경 명령 설명
r1ar2 두 번째 파일의 r2 위치에 있는 행을 첫 번째 파일의 r1 위치에 추가
r1cr2 r1 위치에 있는 행을 두 번째 파일의 r2 위치의 행으로 변경
r1dr2 두 번째 파일의 r2 위치에 있어야 할 행을 첫 번째 파일의 r1 위치에서 삭제

 

[cmd_test@btjeon-naver ~]$ diff -c file1.txt file2.txt 
*** file1.txt	2022-06-02 11:25:30.231835775 +0900
--- file2.txt	2022-06-02 11:25:39.592828802 +0900
***************
*** 1,4 ****
- a
  b
  c
  d
--- 1,4 ----
  b
  c
  d
+ e

문맥 방식(-c) 보기

 

<diff 문맥 방식 변경 지시자>

지시자 의미
(없음) 문맥 표시 행. 두 파일 간의 차이점을 나타내지 않는다.
- 삭제된 행. 이 행은 첫 번째 파일에는 나타나지만 두 번째 파일에는 나타나지 않을 것이다.
+ 추가된 행. 이 행은 두 번째 파일에는 나타나지만 첫 번째 파일에는 나타나지 않을 것이다.
! 변경된 행. 이 행은 두 가지 버전이 표시될 것이다. 변경 내역의 각자의 영역에 각각 표시된다.

 

[cmd_test@btjeon-naver ~]$ diff -u file1.txt file2.txt 
--- file1.txt	2022-06-02 11:25:30.231835775 +0900
+++ file2.txt	2022-06-02 11:25:39.592828802 +0900
@@ -1,4 +1,4 @@
-a
 b
 c
 d
+e

통합 방식(-u) 보기 - 문맥 방식에 비해 중복 행은 제거된다.

 

<diff 통합 방식 변경 지시자>

지시자 의미
(없음) 이 행은 두 파일 모두 공유한다.
- 이 행은 첫 번째 파일에서 삭제된다.
+ 이 행은 첫 번째 파일에서 추가된다.

 

[cmd_test@btjeon-naver ~]$ diff -Naur file1.txt file2.txt > patchfile.txt 
[cmd_test@btjeon-naver ~]$ patch < patchfile.txt
patching file file1.txt
[cmd_test@btjeon-naver ~]$ cat file1.txt 
b
c
d
e
[cmd_test@btjeon-naver ~]$ cat patchfile.txt 
--- file1.txt	2022-06-02 11:25:30.231835775 +0900
+++ file2.txt	2022-06-02 11:25:39.592828802 +0900
@@ -1,4 +1,4 @@
-a
 b
 c
 d
+e

patch 명령어는 diff의 출력 결과를 받아서 이전 버전의 파일을 새 버전으로 변환시키는 데 일반적으로 사용된다.

 

[cmd_test@btjeon-naver ~]$ echo "lowercase letters" | tr a-z A-Z
LOWERCASE LETTERS

tr 명령어를 통해 문자들을 변환할 수 있다.

 

[cmd_test@btjeon-naver ~]$ echo "lowercase letters" | tr [:lower:] A
AAAAAAAAA AAAAAAA

여러 문자들을 하나의 문자로 변환하기

 

[cmd_test@btjeon-naver ~]$ cat -A dos.txt 
my name is byegontae jeon.^M$
I am a professional engineer.^M$
Good Job!!!^M$
[cmd_test@btjeon-naver ~]$ tr -d '\r' < dos.txt > unix.txt
[cmd_test@btjeon-naver ~]$ cat -A unix.txt 
my name is byegontae jeon.$
I am a professional engineer.$
Good Job!!!$

이와 같이 MS-DOS 텍스트 파일을 유닉스 스타일의 텍스트로 변환할 수 있다. (-d 옵션은 문자열을 삭제하는 옵션)

 

[cmd_test@btjeon-naver ~]$ echo "aaabbbccc" | tr -s ab
abccc

-s 옵션을 사용하여 문자의 반복 개체를 축소할 수 있다.

[cmd_test@btjeon-naver ~]$ echo "abcabcabc" | tr -s ab
abcabcabc

반복 문자들은 반드시 인접해야 한다.

 

[cmd_test@btjeon-naver ~]$ echo "front" | sed 's/front/back/'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed 's_front_back_'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed 's-front-back-'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed 'ssfrontsbacks'
back

sed는 텍스트 스트림과 명시된 파일 집합과 표준 입력에서도 텍스트 편집을 수행한다. 기본적으로 슬래시(/) 문자가 구분자로 사용되지만, 다른 문자들도 가능하다.

 

[cmd_test@btjeon-naver ~]$ echo "front" | sed '1s/front/back/'
back
[cmd_test@btjeon-naver ~]$ echo "front" | sed '2s/front/back/'
front

위와 같이 편집될 입력 스트림의 행 번호를 지정할 수 있다.

 

<sed 주소 표기법>

주소 설명
n 행 번호
$ 마지막 행
/regexp/ POSIX 기본 정규 표현식과 일치하는 행들. 정규 표현식은 슬래시 문자로 구분된다. 부가적으로 정규 표현식은 /cregexpc를 표현식과 함께 명시하면 다른 문자로 구분될 수 있다. 여기서 c는 구분자로 사용할 대체 문자다.
addr1, addr2 addr1부터 addr2까지의 범위의 행들. 주소는 단일 주소 형태의 어느 것이든 상관없다.
first~step first 번호에 표현된 것과 일치하는 행과 그 다음 step 간격마다 모든 행. 예를 들어 1~2는 모든 홀수 행을, 5~5는 5번 행과 그 이후 5번째 행을 가리킨다.
addr1, +n addr1과 일치하는 행과 다음 n개의 행들
addr! addr을 제외한 모든 행. addr에는 위 형태 중 어느 것이든 올 수 있다.

 

[cmd_test@btjeon-naver ~]$ sed -n '1,5p' distros.txt
SUSE	10.2	12/07/2006
Fedora	10	11/25/2008
SUSE	11.0	06/19/2008
Ubuntu	8.04	04/24/2008
Fedora	8	11/08/2007

1~5번 행의 내용을 출력한다. p가 단순 출력 명령이다.

 

[cmd_test@btjeon-naver ~]$ sed -n '/SUSE/p' distros.txt
SUSE	10.2	12/07/2006
SUSE	11.0	06/19/2008
SUSE	10.3	10/04/2007
SUSE	10.1	05/11/2006

SUSE가 포함된 행들을 출력한다.

 

[cmd_test@btjeon-naver ~]$ sed -n '/SUSE/!p' distros.txt
Fedora	10	11/25/2008
Ubuntu	8.04	04/24/2008
Fedora	8	11/08/2007
Ubuntu	6.10	10/26/2006
Fedora	7	05/31/2007
Ubuntu	7.10	10/18/2007
Ubuntu	7.04	04/19/2007
Fedora	6	10/24/2006
Fedora	9	05/13/2008
Ubuntu	6.06	06/01/2006
Ubuntu	8.10	10/30/2008
Fedora	5	03/20/2006

SUSE가 포함된 행만 제외하고 출력한다.

 

<sed 기본 편집 명령어>

주소 설명
= 현재 행번호를 출력한다.
a 현재 행 뒤에 텍스트를 추가한다.
d 현재 행을 삭제한다.
i 현재 행 앞에 텍스트를 삽입한다.
p 현재 행을 출력한다. sed는 기본적으로 모든 행을 출력하고, 파일 내에서 지정된 주소와 일치하는 행들만 편집한다. 기본 동작은 -n 옵션을 명시하여 무시할 수 있다.
q 더 이상 처리할 행이 없으면 종료한다. 만약 -n 옵션이 명시되어 있지 않으면 현재 행을 출력한다.
Q 더 이상 처리할 행이 없으면 종료한다.
s/regexp/replacement/ regexp가 발견될 때마다 replacement의 내용으로 치환한다. replacementregexp와 일치하는 텍스트와 동등한 특수 문자 &를 포함할 수도 있다. 게다가 replacementregexp의 부 표현식과 상응하는 내용을 가리키는 \1부터 \9까지의 문자열을 포함할 수도 있다. replacement 다음의 '/'는 s 명령의 동작을 수정하기 위해 명시될 수 있는 옵션 플래그이다.
y/set1/set2 set1 문자들을 set2의 상응하는 문자들로 변환한다. sed는 tr과 달리 동일한 길이의 집합이 필요하다.

 

[cmd_test@btjeon-naver ~]$ sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' distros.txt 
SUSE	10.2	2006-12-07
Fedora	10	2008-11-25
SUSE	11.0	2008-06-19
Ubuntu	8.04	2008-04-24
Fedora	8	2007-11-08
SUSE	10.3	2007-10-04
Ubuntu	6.10	2006-10-26
Fedora	7	2007-05-31
Ubuntu	7.10	2007-10-18
Ubuntu	7.04	2007-04-19
SUSE	10.1	2006-05-11
Fedora	6	2006-10-24
Fedora	9	2008-05-13
Ubuntu	6.06	2006-06-01
Ubuntu	8.10	2008-10-30
Fedora	5	2006-03-20

's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/'

날짜 포맷 변경 : mm/dd/yyyy -> yyyy-mm-dd

([0-9]{2})/([0-9]{2})/([0-9]{4})$

위와 같이 [0-9]{2}와 같은 표현식을 괄호로 둘러싸면 서브 표현식을 만들 수 있으며, replacement에서 \3-\1-2 이런 식으로 후방 참조를 할 수 있다.

 

[cmd_test@btjeon-naver ~]$ echo "aaabbbccc" | sed 's/b/B/'
aaaBbbccc
[cmd_test@btjeon-naver ~]$ echo "aaabbbccc" | sed 's/b/B/g'
aaaBBBccc

s 명령어에서 g 플래그를 사용하면 모든 문자들을 변경할 수 있다.

 

[cmd_test@btjeon-naver ~]$ vi distros.sed
-----------------------------------------------------------------------------------------
# sed script to produce Linux distributions report

1 i\
\
Linux Distribution Report\

s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIGKLMNOPQRSTUVWXYZ/
-----------------------------------------------------------------------------------------

sed 명령어에서 사용할 script 파일

- 입력의 첫 행 주소 1에 텍스트를 삽입하기 위애 i 명령어를 사용한다. 백슬래시 캐리지 리턴 문자(\\r)는 텍스트 스트림에 캐리지 리턴값을 내장하기 위해 사용한다.

- y 명령어는 문자 범위(예를 들어 [a-z])와 POSIX 문자 클래스를 지원하지 않는다.

 

[cmd_test@btjeon-naver ~]$ sed -f distros.sed distros.txt 

Linux Distribution Report

SUSE	10.2	2006-12-07
FEDORA	10	2008-11-25
SUSE	11.0	2008-06-19
UBUNTU	8.04	2008-04-24
FEDORA	8	2007-11-08
SUSE	10.3	2007-10-04
UBUNTU	6.10	2006-10-26
FEDORA	7	2007-05-31
UBUNTU	7.10	2007-10-18
UBUNTU	7.04	2007-04-19
SUSE	10.1	2006-05-11
FEDORA	6	2006-10-24
FEDORA	9	2008-05-13
UBUNTU	6.06	2006-06-01
UBUNTU	8.10	2008-10-30
FEDORA	5	2006-03-20

-f 옵션을 사용해서 좀 더 복잡한 명령을 사용할 수 있다.

 

 

 

 

 

 

 

출처 : 리눅스 커맨드라인 완벽 입문서