2014.05.12 18:43

특정 영역의 문자열 치환하기

vi에서 특정 영역의 문자열을 치환하기 위해 다음과 같이 한다.


'v'를 누르고 block 지정을 한다.


':'를 누르면 다음과 같이 뜬다.


:'<,'>


추가로 다음을 입력해 완성한다.


:'<,'>s/old/new/g




sed 명령어 일반적인 입력 형식

# sed [옵션] ['영역과연산자와패턴의 조합'] [파일이름]

 

실제로 명령어 실행할땐 대괄호는 제거한다. 보기쉬우라고 적은것임

 

 

이걸 기억하자

sed명령어 뒤에 오는 인자들은 옵션, 영역(생략시전체영역), 패턴, 연산자, 데이터 로 구성되어진다.

 

sed '4q' data.txt; 영역, 연산자, 데이터

sed '/Pattern1/p' data.txt; 연산자, 패턴, 데이터

sed '/Pattern1/d' data.txt; 연산자, 패턴, 데이터

 

sed 's/Pattern1/Pattern2/' data.txt; 연산자, 패턴, 데이터 로 구성

sed 's/Pattern1/Pattern2/g' data.txt; 연산자, 패턴, 데이터 로 구성

 

sed '5,$s/Pattern1/Pattern2/' data.txt; 영역, 연산자 , 패턴, 데이터로 구성

sed '5,$s/Pattern1/Pattern2/g' data.txt; 영역, 연산자 , 패턴, 데이터로 구성

 

sed -n '1,5p' data.txt; 옵션, 영역, 연산자 , 데이터로 구성

 

이렇게 사용되는 명령어들을 리다이렉트 하거나, 파이프라인을 써서 넘기면된다.

 

어디에 옵션을쓰고 어디에

 

위에서도 보았겠지만 패턴이 존재할 때에 연산자는 영역과 패턴사이에 위치하거나 패턴 뒤에 위치한다.

아직까지 확실히 연산자와 패턴, 영역이 구분가지 않더라도 다음을 읽어나가보자.

 

연산자는 다음과 같다.

 

p (print) : 출력( 특정 줄이나 패턴에 대한 출력은 -n 옵션과 함께 사용)

s (switch) : 치환( 뒤에 치환패턴이 오면 반드시 써주어야 한다)

d (delete): 삭제

g (global): 전체영역( 보통 마지막에오며 패턴과일치하는 모든 데이터영역을 지칭,

치환패턴 에서 s 연산자 )

q (quit): 종료 (영역과함께 사용시 끝지점만 지정가능하다.)

 

 

연산자의 사용은 다음과 같다.

 

: /p, /s, /d, /g, /q 와같이 연산자가 / 앞에 붙여도 되고 / 뒤에 붙는 경우도 있다.

 

'4p' ;4번째 라인만 출력(앞에 -n 옵션과함께)

'4d'; 4번째 라인 지움

's/A/B/g'; 모든 A를 B로 치환

 

 

여기서 [옵션]은 다음과같다

 

-n: 뒤에오는 패턴과 일치하는 라인만 뒤에오는 연산자에 해당하는 동작을 하시오.

 

-e: 두개 이상의 패턴을 지정가능

 

 

 

영역지정

형식: 4= 뒤에 오는 연산자에 따라서 p가오면 4번째 라인만, q 가 오면 4번째 라인까지

1,10 = 1라인부터 10라인까지

1,$= 1부터 끝라인까지

 

 

패턴

패턴은 하나의 패턴당 /로 시작해서 / 로 끝나며 , 단일 패턴과 복수 패턴(치환패턴)으로 나눌 수 있다.

단일 패턴은 패턴이 하나란 말이고 단순히 /pattern1/ 이런식이다.

 

ex > sed '/pattern1/' data.txt 이렇게 하면 연산자가 없어서 실행이 안되겠지만, 의미는 다음과 같다

: [data.txt에서 pattern1 을 찾아서] 딱 이런뜻이다.

 

치환 패턴은 패턴이 두개란 말이고 s/pattern1/pattern2 이런식이다. 여기서 s연산자는 치환을 할때 치환패턴과 함께 꼭 같이 써주어야 하는 연산자다

 

ex > sed 's/pattern1/pattern2' data.txt

이렇게 하면 연산자가 없어서 실행이 안되겠지만, 의미는 다음과 같다

: data.txt에서 pattern1 을 찾아서 각 라pattern2로 바꾸시오 (여기서 바꾸시오란 뜻이 s 연산자의 뜻이다)

 

* sed 's/pattern1/pattern2' data.txt 이렇게만 쓰게 된다면, 각 라인별로 처음 나오는

pattern1만 pattern2로 바꾼다. 한 라인에 pattern1이 두 번 나오면 두 번째 pattern1은 pattern2로 바뀌지 않는다.

이때 해줄 수 있는것이 g 연산자이다. 그래서 g연산자는 pattern2 뒤에 오게 되는데, 의미는 글로벌하게이다.

 

 

여기서 sed 에서 옵션과 영역 패턴 연산자를 사용하는 방법은 논리적으로 직관적이기 때문에 먼저 말로 해보면 어려울 것이 없다.

일반적인 입력 형식은 다음과 같다

# sed [옵션] ['영역과연산자와패턴의 조합'] [파일이름]

 

여기서 ['영역과연산자와패턴의 조합'] 부분이 까다로울 것이다.

다음의 동작을 예를 들어보자

 

 

['어디서부터,어디까지/패턴1에대해/패턴2로/전부바꾼다.'] 라는 동작을

 

'1,$s/aaa/bbb/g' 다음과 같이 표현할 수 있다.

 

 

 

 

sed '4q' data.txt; 4번째 라인까지 data.txt의 내용을 출력하고 종료!

sed -n '/Pattern1/p' data.txt; Pattern1 을 포함하는 라인은 모두 출력

sed '/Pattern1/d' data.txt; Pattern1 을 포함하는 라인은 모두 삭제

 

sed 's/Pattern1/Pattern2/' data.txt

; Pattern1을 pattern2로 바꾸는데 각 줄당 처음나오는 pattern1만 pattern2로 바꿈

sed 's/Pattern1/Pattern2/g' data.txt

; Pattern1을 pattern2로 바꾸는데 모든 pattern1을 pattern2로 바꿈

 

sed '5,7s/Pattern1/Pattern2/' data.txt

; 1번째라인부터 7번째 라인까지 pattern1을 pattern2로 바꾸는데 각줄의 첫번째pattern1만바꿈

sed '5,7s/Pattern1/Pattern2/g' data.txt

; 1번째라인부터 7번째 라인까지 pattern1을 pattern2로 바꾸는데 모든 pattern1을 바꿈

 

sed -n '1,5p' data.txt; 1번째 라인부터 5번째라인까지 출력




출처 : devday.tistory.com, dbckdgns0515.tistory.com


Trackback 0 Comment 0