# sed -e 'd' /etc/services이 명령을 실행하면 화면에 아무것도 출력하지 않을 것이다. 왜 그런지 살펴보자. 우리는 sed를 "d" 명령으로 실행했다. sed는 /etc/services 파일을 열어서 모든 줄에 대해서 "d" 명령을 수행한다. "d"는 "delete line"명령을 수행한다. 줄을 지우라는 의미다. 모든 줄에 대해서 "delete line"이 적용되므로 결국 빈 줄을 표준출력한다.
# sed -e '1d' /etc/services | more이 명령을 실행하면 /etc/service의 첫 라인만 삭제 된다. 앞에 1은 명령이 적용될 범위를 의미하는데, 첫번재 줄을 의미한다. 따라서 "d"명령은 첫째 줄에만 적용이 되어서, 첫 줄만 삭제되는 거다.
# sed -e '1,10d' /etc/services"d"명령은 첫번째 줄에서 10번째 줄까지만 적용되고 나머지 줄은 무시한다.
# sed -e '/^#/d' /etc/services | more이 코드를 실행하면 주석을 제외한 내용을 보여주는 걸 확인할 수 있다. 어떻게 이런일이 가능한지 분석해보자. 이 코드는 "/^#/"와 "d" 두 부분으로 이루어져있다. d는 삭제하라는 명령이고, 그렇다면 문제는 "/^#/"이 부분의 해석이다. sed는 "//"를 만나면 정규표현식으로 간주해서 해석을 한다. "^#"이 정규표현식인데, ^는 줄의 처음을 의미한다. 즉 이 정규표현은 줄의 "처음에 #이 등장하는 것을 패턴일치 시킨다." 결국 줄의 처음에 #이 등장하면(/^#/) + 삭제(d) 삭제하라는 명령을 수행한다.
Character | 설명 |
^ | 줄의 처음에 일치 |
$ | 줄의 마지막에 일치 |
. | 모든 (단일)문자와 일치 |
* | 하나 혹은 그 이상의 앞에 나오는 문자와 일치 |
![] | ![]안의 모든 문자와 일치 |
/./ | 줄에 어떤 문자와도 일치 |
/../ | 적어도 두개의 문자를 가진 줄과 일치 |
/^#/ | #로 시작하는 줄 |
/^$/ | 공백 줄 |
/} *$/ | }로 끝나고 공백 문자가 있는 줄 |
/abc/ | 'a', 'b', 'c'중 하나라도 포함하는 줄 |
#include <stdio.h> int main() { printf("Hello world"); } void hello() { }지금까지의 방법으로는 main 함수만 추려낼 수는 없다. 패턴 상으로 보면 "main("에서 부터 첫줄이 "}"끝났을 때까지를 main 함수로 정의할 수 있지만, 줄단위로만 패턴을 일치하기 때문이다.
# sed -n -e '/main/,/^}/p' main.c int main() { printf("Hello world"); }
# sed -n -e '/BEGIN/, /END/p' file이렇게 하면 "BEGIN"패턴과 END 패턴 사이의 모든 줄을 블럭으로 처리한다.
# sed -e s/5678/xxxx/g test.txt 1234 xxxx hello world 1234xxxx xxxx
sed -e s/5678/xxxx/g test.txt > test.txt.tmp mv test.txt.tmp test.txt
# sed -e '1,10s/1234/xxxx/g' test.txt
# sed -e '/^$/,/^END/s/bus/texi/g' test.txt
# sed -e 's/\/usr\/local/\/usr/g' test.txt
# sed -e 's:/usr/local:/usr:g' test.txt
<b>This</b> is what <b>I</b> meant.
# sed -e 's/<.*>//g' test.txt
$ sed -e 's/<[^>]*>//g' test.txt[^>]에서 ^는 none의 의미다. 해석하면 "<이 등장한 다음에 처음 등장하는 >" 사이의 문자와 일치한다 라는 의미가 된다.
'[a-x]*'
[:alnum:] | [a-z A-Z 0-9], 모든 알파벳 문자와 숫자 |
[:alpha:] | [a-z A-Z], 모든 알파벳 문자 |
[:blank:] | 스페이스 문자와 탭문자 |
[:cntrl:] | 모든 컨트롤 문자들 |
[:digit:] | 숫자, [0-9] |
[:graph:] | 모든 visible 문자들 |
[:lower:] | 알파벳 소문자, [a-z] |
[:print:] | Non-control 문자 |
[:space:] | 공백문자 |
[:upper:] | 알파벳 대문자, [A-Z] |
[:xdigit:] | 16진수 문자[0-9 a-f A-F] |
echo "yundream 33" | sed -e 's/[a-z]*/My name is &. Age is/' My name is yundream. Age is 33
# echo "yundream programmer" | sed -e 's/\([a-z]*\) \([a-z]*\)/My name is \1. Job is \2. Hello \1/' My name is yundream. Job is programmer. Hello yundream
#!/bin/bash for file in ls * do if [ -f $file ] then tmpfile="$file.tmp" sed -e 's/xxx/yyy/g' $file > $tmpfile fi done
파일 합치기 (0) | 2015.04.21 |
---|---|
Ant Build 프로퍼티 값 (외부인자 받기) (0) | 2015.04.20 |
shellscript tee (0) | 2015.04.15 |
cp: omitting directory 에러 (0) | 2015.04.10 |
vi editor 명령어집합 (0) | 2015.04.10 |
댓글 영역