IS lab. 김건영 http://hagazzusa.github.io/ Sed, 정규표현식 IS lab. 김건영 http://hagazzusa.github.io/
Sed? Awk(담 시간에 할거)? 공통적으로 간단하게 말하자면 데이터 가공을 위한 텍스트 처리 유틸 프로그램 리눅스 쉘 환경에서 지원함 표준입력 표준출력 (stdout, stdin) 사용으로 원본파일을 건드리 지 않음 간단하게 말하자면 Sed: 비대화형 텍스트 편집기 Awk: 필드 단위의 패턴 처리기 주로 Sed를 이용해 raw data를 가공하고 awk를 이용해 원하는 형태로 만듬
Sed - 기본 사용법 Sed [-e “script”] [-f “script file”] [파일] 명령어가 하나일 경우 –e 옵션은 생략가능 ex) sed 8d file : file의 8번째 줄 제거 후 출력 Sed용 script 연산자 연산자 이름 의미 [주소 범위]p print [주어진 주소범위]를 출력 [주소 범위]d delete [주어진 주소범위]를 삭제 a 와 i Append, insert 주소 혹은 패턴이 있는 줄 후, 전에 문자열추가 s/pattern1/pattern2/ substitute 한 라인에서 처음 나타나는 pattern1을 pattern2로 치환 [주소 범위]/s/pattern1/pattern2/ 주소 범위에 대해서 한 라인에 처음 나타나는 pattern1을 pattern2로 치환 [주소 범위]/y/pattern1/pattern2/ transform 주소 범위에 대해 pattern1에 나타나는 어떤 문자라도 pattern2에 나타나는 문자로 변경
Sed 실습용 자료 cd mkdir sed cp /home/gykim/sed/sed00 ./sed/
Sed – 출력(print) Sed [시작, 마지막]p file : 시작부터 마지막 까지 출력 sed /patt/p file : patt이 나오는 모든 줄 출력 sed [시작],/[patt]/p file : 시작~patt이 나오는 곳까지 -n 옵션을 주면 중복출력을 막아줌 1부터 출력
Sed – 출력(print) Address가 들어간 줄만 출력 1부터 첫번째 address가 나오는 줄까지 출력 1부터 20까지 제외하고 출력
Sed – 삭제(delete) Sed [시작, 마지막]d file : 시작부터 마지막 까지 삭제 sed /patt/d file : patt이 나오는 모든 줄 삭제 sed [시작],/[patt]/d file : 시작~patt이 나오는 곳까지 1부터 13번째 줄까지 삭제
Sed – 삭제(delete) “가 들어간 모든 줄 삭제 5번줄부터 address가 있는 줄까지 삭제 1번과 2번 줄을 제외하고 삭제
Sed – 추가, 삽입 (append, insert) Sed [시작,끝]a[“문자열”] : 해당되는 주소마다 다음 줄에 문자열 추가 : a 대신 i를 쓸 경우 줄 이전에 문자열 추가 앞서 배운 패턴매칭 응용가능
Sed – 치환(substitute) Sed [주소 범위]s/patt1/patt2/[매칭번호] : patt1을 patt2로 치환, 주소를 안주면 전체 sed s/patt1/patt2/2 : 한 줄에서 두 번째로 매칭된 패턴만 변환 sed s/patt1/patt2/g : g가 없으면 한 줄에서 첫 번째로 매칭된 패턴만 치환이 된다. Cambridge를 kangwon으로 치환
Sed – 치환(substitute) 부분치환과 global 활용법 숫자와 g 의외에도 p(수정된 것만 화면에 출력) w file(file에 저장) 등이 존재
Sed – 변환(transform) Sed y/patt1/patt2/ file : 문자단위 치환 patt1과 patt2는 크기가 같아야함 : 아래 예제는 a는 1로 b는 2로 바꿔줌 앞선 예제들과 같이 주소지정 가능
Sed – pipeline 응용 File path를 주지 않고 다른 프로그램의 결과를 pipeline 으로 넘겨도 작동한다. (cat의 -n 옵션은 줄 번호를 매겨주는 옵션)
Sed – redirection 응용 파일 내용을 < 을 이용해 stdin으로 넘겨주거나 >을 이용 하여 sed 프로그램의 결과를 저장할 수 도 있다.
정규표현식 특정한 규칙을 가진 문자열의 집합을 표현할 수 있는 형식 언어. Ex) [a-z] : a부터 z까지 중 하나 gr(a|e)y : gray 혹은 grey 촘스키 언어 계층 3유형 정규문법에서 출발 복잡하나 잘만 쓰면 문자열 처리에 강한 힘을 발휘함 Ex) HTML에서 <a href=link>~</a>에서 link만 따오기
정규표현식 앞서 배운 pattern은 단순 문자열이 아닌 고차원, 다기능 의 정규표현식으로 대체가 가능하다. Ex:모든 알파벳 소문자열을 1로 대체한다. Sed에서 모든 정규표현식을 쓰려면 –r 옵션이 필요
정규표현식 - 메타문자 실제 단어가 아닌 패턴 매칭을 위해 사용되는 문자들 이탤릭체는 문자와 직접 매칭이 아닌 반복을 나타냄 실제 단어가 아닌 패턴 매칭을 위해 사용되는 문자들 이탤릭체는 문자와 직접 매칭이 아닌 반복을 나타냄 메타문자 의미 예제 설명 ^ 라인의 처음 /^linux/ Linux로 시작하는 모든 라인들 $ 라인의 끝 /linux$/ Linux로 끝나는 모든 라인들 . 모든 문자와 매칭 /l···x/ ‘l’로 시작해서 x로 끝나는 문자가 있는 라인들 * 매칭되는 문자가 없거나 여러 개의 문자열이 될 수 있다. /. *linux/ 아무것도 없거나, 아무 문자나 반복되어 linux로 끝나는 것 ? *와 비슷하나 0 또는 1회로 제한된다. /.?linux/ 아무것도 없거나 linux앞에 한 단어가 오는 것 + *와 비슷하나 1회 이상 /.\+linux/ Linux앞에 한 단어가 오는 것
정규표현식 - 메타문자 강조되어 있는건 POSIX 표준이 아님 메타문자 의미 예제 설명 [ ] 괄호 안의 문자 하나와 매칭 /[Ll]inux/ Linux 또는 linux를 포함하는 라인들 [^ ] 괄호 안의 문자를 제외하고 매칭 /[^A-KM-Z]inux/ Inux 앞에 A~K, M~Z까지 문자를 포함하지 않는 라인들 \(..\) 정규표현식 그룹 s/\(love\)able/\1er/ \1 : 1번 tag로 저장 able을 er로 치환 /< 단어의 시작 /\<linux/ Linux로 시작하는 단어를 포함하고 있는 라인들을 매칭 /> 단어의 끝 /linux\>/ Lunux로 끝나는 단어를 포함하고 있는 라인들을 매칭 & 치환 문자열로 기억될 수 있는 검색 문자열을 저장 s/linux/**&**/ &는 검색 문자열 linux => **linux**
정규표현식 - 메타문자 앞서 *, +, ? 와 똑같은 역할을 한다. 메타문자 의미 예제 설명 x\{m\} /o\{5\}/ O가 5회 반복 x\{m,\} 적어도 m회 반복 /o\{5,}/ O가 적어도 5회 반복 x\{m,n\} m회~n회 사이 반복 /o\{5,10\}/ O가 5회에서 10회 사이 반복
Sed – 정규표현식 , 시작과 끝, 반복 ^[\ ]* : 줄의 시작부터 스페이스가 0회 이상일 경우 *대신 ?와 +도 써서 차이점을 확인해보자 .$ : 줄끝(\n) 그 앞의 한 문자
Sed – 정규표현식 , 문자 클래스 [abcd] = [a-d] : a부터 d 중 하나 a~d 로 이루어진, 한 문자 이상의 연속된 문자열을 k로 치환한다. (address -> kress) [^\{\}0-9,\ \”:] : {}숫자,”공백:을 제외한 다른 문자 중 하나 가 한 문자 이상 연속된 문자열을 매칭하여 k로 치환한 다
Sed – 정규표현식 , 하위식 \”\(f\|p\).*”\ : “로 시작하고 f혹은 p가 다음 단어이 고 .가 *로 반복되면서 “로 끝나는 패턴 을 포함하는 줄을 출력한다.
Sed script file 여러 sed 명령어를 연속으로 작성한 파일 a->A, e->E, i->I로 치환
Sed in shell script a->A, e->E, i->I로 치환해주는 스크립트 둘 다 같은 동작을 함 $1 은 커맨드 라인 첫 번째 매개변수 $0 은 실행되는 sh의 파일 이름
Block grouping {}을 이용해 여러 명령어를 그룹핑 가능 N은 한 라인을 더 추가하여 검색한다는 명령어 (2줄검색) ./~~.sh sed00으로 실행하면 옆과 같음
Exercise Sed00에 있는 모든 특수문자를 지워 다음과 같이 바꾸고. (단 :은 =로 바꿀 것) 줄번호를 추가하여 name=이 있는 줄만 출력한다.
Exercise 실행 스크립트와 결과를 스크린샷으로 찍어서 gyk@kangwon.ac.kr 으로 보내주세요. [학번] IR SED 라고 제목 지으시면 됩니다. 정보) 파일에 등장하는 특수문자는 다음과 같다. { } . , “ : 줄 번호 추가는 cat –n 사용