Download presentation
Presentation is loading. Please wait.
1
기본 셸로는 Bash 셸을 사용하라. 하지만 스트립트를 실행하기 위해서는 Bourne 셸을 사용하라.
4. Bourne-Again 셸 기본 셸로는 Bash 셸을 사용하라. 하지만 스트립트를 실행하기 위해서는 Bourne 셸을 사용하라. 셸 이름 man 페이지 크기 상대적인 복잡도 sh (Bourne) 44,550 1.00 csh (C) 76,816 1.73 bash (Bash) 127,361 2.86 zsh (Zsh) 133,565 3.00 ksh (Korn) 141,391 3.18 tcsh (Tcsh) 199,834 4.49
2
소개 모든 유닉스/리눅스 시스템에서 유효한 것이며 다양한 프로그래밍 언어를 지원
Stephen Bourne에 의해 작성된 최초의 대중화된 유닉스 셸인 Bourne 셸에서 유래 Borne-Again 셜 = C 셀 + Korn 셸 Shell의 공통적인 기능 이외에 Bourn-Again 셸에 추가된 기능들 변수를 설정하고 접근하는 방법들 조건 분기, 루핑과 인터럽트 조작을 지원하는 내장된 프로그래밍 언어 기존의 리다이렉션과 명령열 운영의 확장 새로운 몇 개의 내장 명령어 Unix/Linux
3
소개 Bourne Shell (Steven Bourne, AT&T) Bash Shell (Bourn-Again Shell)
/bin/sh $ .profile (실행은 $ . .profile) 프로그래밍 기능 C Shell (Bill Joy, Berkeley) TC Shell /bin/csh % .login .cshrc (실행은 % source .cshrc) Bourne shell + (대화형 명령입력 + 별명(alias) + history) Korn Shell (Dave Korn) Z Shell /bin/ksh Bourne shell + C shell Bourne-Again Shell /bin/bash .bash_profile .bashrc .bash_logout (.bash_login은 호출 않음) Bourne shell + (강력한 스크립팅 기능 + C 셸과 Korn 셸의 유용한 기능 결합) Unix/Linux
4
소개 셸 기능 profile 내장 명령어 프로그래밍 언어 변수 시작하기 리다이렉션 명령열 trap set read
<& >& for case while if {...} export readonly profile Unix/Linux
5
시작하기 /bin/bash sh 명령어 : 스크립트나 터미널로부터 수동적 호출 가능 대화형 셸 :
시작할 때 자신의 홈 디렉토리에서 “.bash_profile” 화일을 찾음 “.bash_profile”의 존재 유무에 관계없이 prompt를 내보내고 사용자의 명령을 기다림 비대화형 셸: 어떤 시작 화일도 읽지 않음 Unix/Linux
6
변수 변수의 생성 및 할당 (‘=‘전후에 빈칸 없게)
{name=value}+ 변수가 존재하면 새로운 값으로 바꾸고, 존재하지 않으면 자동적으로 만들어짐. 공백은 “ ” 로 (예) $ name=meeyoung age=20 $ echo $name is $age meeyoung is 20 $ name=MeeYoung Sung error 문자열은 따옴표(“ ”)로 표시 $ name=“MeeYoung Sung” Unix/Linux
7
변수로의 접근 Unix/Linux
8
변수로의 접근 $name : name의 값으로 대치
(예) $ verb=sing 변수할당 $ echo I like $verbing verbing 변수는 없다 I like $ echo I like ${verb}ing 성공 I like singing $ echo I like re${verb}ing 성공 Unix/Linux
9
4.3 변수 변수로의 접근 ${name-word} : 설정 되었으면 name의 값으로 대치,
${name+word} : name이 설정되었을 때 word만 대치 (예) $ startDate=${startDate-`date`} $ echo $startDate 설정된 값 보기 Tue Feb 4 06:51 CST 1998 $ flag= 변수 할당 $ echo ${flag+’flag is set’} 조건부 메시지 #1 flag is set $ echo ${flag2+’flag2 is set’} 조건부 메시지 #2 Unix/Linux
10
변수로의 접근 4.3 변수 ${name=word} : name이 설정되지 않았으면 word를 할당하고 name의 값으로 대치 ${name-word}와 동일 ${name?word} : name이 설정되지 않았으면 word는 표준 에러 채널로 표시되고 그 셸은 종료 (예) $ echo x=${x=10} 디폴트 값 할당 x=10 $ value=${x?‘x not set’} 접근 성공 $ echo $value 값 보기 10 $ value=${grandTotal? ‘grand total not set ‘} 미설정 grandTotal : grand total not set $ grandTotal=100 $ value=${grandTotal? ‘grand total not set ‘} … 설정 Unix/Linux
11
표준 입력으로부터 변수 읽기 read {variable}+ (예) $ cat read.bash
echo -n “enter your name, age : ” read name age echo your name is $name echo your age is $age $ read.bash enter your name, age : meeyoung 20 your name is meeyoung your age is 20 Unix/Linux
12
4.3 변수 변수의 범위 전환 export {variable}+ 환경변수로 범위 전환시키도록 명시된 변수들을 표시
환경변수는 대문자 사용 (예) $ export 어떤 변수도 명시되지 않으면 모든 변수들의 목록이 나타남 export TERM $ DATABASE=/dbase/db 지역변수 생성 $ echo $DATABASE $ sh $ ^D $ export DATABASE $ export export에 더해졌음 export DATABASE Unix/Linux
13
4.3 변수 변수의 범위 전환 env {variable = value}* [command]
(예) $ env … 환경을 표시 PWD=/home/mysung LANG=ko_KR.eucKR KDE_IS_PRELINKED=1 KDEDIRS=/usr SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass HISTCONTROL=ignoredups SHLVL=1 HOME=/home/mysung LOGNAME=mysung QTLIB=/usr/lib/qt-3.3/lib CVS_RSH=ssh LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/mysung G_BROKEN_FILENAMES=1 _=/bin/env (활용예) $ mkdir test ; mv hello.c test; cd test $ gcc myprog.c –o hello $ cd $ dir= ~mysung/test/ $ env PATH=$dir hello Unix/Linux
14
4.3 변수 읽기 전용 변수 readonly {variable}+
(cf) 환경변수로 전환된 변수의 읽기 전용 상태는 상속되지 않음 (예) $ password=nicechej ...지역변수의 할당 $ echo $password nicechej $ readonly password ...보호(수정방지) $ readonly readonly password ... 모든 readonly 변수 나열 $ password=chej ...변수 수정시도 password : is read only ... error Unix/Linux
15
미리 정의된 지역 변수 이름 값 $@ $# $? $! $_ $$ 모든 위치 매개 변수의 개별적으로 인용된 목록
(an individually quoted list of all of the positional parameters) 위치 매개 변수의 수 마지막 명령의 반환 값 마지막 후면 명령의 프로세스 id 명령 줄로부터 혹은 내장 명령어 set(나중에 설명)에 의해 할당된 현재 셸 옵션 이 셸의 프로세스 ID (예) $ cat script.bash echo there are $# command line arguments: $ script.bash nofile tmpfile there are 2 command line arguments: nofile tmpfile $ sleep 1000 & …후면 프로세스 생성 …후면 프로세스의 프로세스 id $ kill $! …프로세스를 사멸시킴 29455 Terminated $ echo $! …프로세스 id는 아직도 기억됨 29455 Unix/Linux
16
미리 정의된 환경변수 이 름 값 $IFS Input Field Separators 셸이 명령어를 실행하기 전 명령 줄을 토큰화 시키는 경우, 설정된 문자를 분리자로 사용. 공백, tab, newline문자를 포함 $PS1 Prompt String 1 명령 라인 프롬프트 형태를 제어하며 디폴트로 $를 갖음 명령줄 프롬프트를 변경하려면 $PS1을 새로운 형태로 지정 $PS2 Prompt String 2 더 많은 입력이 셸에 의해 요구될 때 명령 줄의 보조 프롬프트 형태를 제어, 디폴트로 > 을 갖음. 프롬프롬트 변경시 새로운 형태로 지정 (예) $ PS1=“sh ? ” 새로운 주 프롬프트 설정 sh? oldIFS=$IFS …IFS의 이전 값을 기억 sh? IFS=“:” …단어 분리자를 콜론으로 변경 sh? ls:*.c …실행 성공! /* Bash에서는 적용되지 않음 */ sh? string=“a long\ …긴 문자열을 할당 > string” …”>”는 보조 프롬프트 sh? PS2=“??? ” …보조 프롬프트 변경 ??? string” …”???”는 새로운 보조 프롬프트 ??? echo $string Unix/Linux
17
= \> \>= \< \<= !=
산술 계산 (refer to “let”) expr expression Bash 셸에서는 let expression으로 계산 expression의 요소들은 반드시 공백으로 분리되어야 한다. 기타 연산자 (substr, index, length) 는 x86 only substr 문자열 위치 길이 let built-in function: $ let 인수 [인수 ...] 각각의 인수는 계산한 수치 표현식(arithmetic expression)이다.( 산술 평가참고 ). 마지막 인수를 평가하여 그 결과가 0 이면, let 은 1 을 반환한다; 나머지 경우에는 0 을 반환한다 연산자 의미 \* / % + - = \> \>= \< \<= != \& \| : 곱셈, 나눗셈, 나머지 덧셈, 뺄셈 비교 연산자 논리적 and 논리적 or 문자열 matching Unix/Linux
18
산술계산 4.4 산술 계산 (산술 및 논리 연산 예) expression의 요소들은 반드시 공백으로 분리되어야 한다.
$ x= x의 최초값 $ x=`expr $x + 1` x값 증가 $ let x=x+1 $ echo $x 2 $ x=`expr \* 5` * 계산 후 +계산 $ let x= 2+3*5 17 $ echo `expr \( \) \* 5` \( \) 먼저 계산 25 $ echo `expr \( 4 \> 5 \)` …4 > 5 ? $ echo `expr \( 4 \> 5 \) \| \( 6 \< 7 \)` …4 > 5 또는 6 > 7? 1 (문자열 matching 연산 예) $ echo `expr substr $LOGNAME 3 3` …일치하는 위치, 길이 문자열 추출 (x86 only) $ echo `expr “$LOGNAME” : ‘.*’` …일치하는 문자열 길이 (정규 표현식만) 또는 $ echo `expr match “$LOGNAME” : ‘.*’` …일치하는 문자열 길이 (정규 표현식만) 6 (cf.) $ echo `expr “LOGNAME” : ‘.*’` Unix/Linux
19
조건식 test expression 또는 [ expression ] … 괄호는 반드시 공백(‘ ‘)으로 둘러싸여야 함
test 명령의 옵션 [교재 p171 표 참조] Parentheses : \( \) 논리연산 : ! (false) -a (and) -o (or) 문자열 : -z (no characters) -n (at lease one character) = (equal) != (not equal) 숫자 : -eq (equal) -ne (not equal) -gt (greater than) -ge (greater than or equal) -lt (less than) le (less than or equal) 파일 : r (readable) -w (writable) -x (executable) -f (nondirectory) -d (directory) -s (at least one character) Unix/Linux
20
제어구조: case-in-esac case-in-esac case expression in
패턴에 대응하는 것을 찾아 그 패턴의 명령들을 실행하는 다중 선택형식. expression은 문자열로 계산되는 식이고, pattern은 대표문자를 포함할 수 있음 case expression in pattern { | pattern }* ) list ;; esac Unix/Linux
21
제어구조: case-in-esac (예) $ more menu.bash echo menu test program stop=0
while test $stop -eq 0 do cat << ENDOFMENU 1 : print the date. 2,3 : print the current working directory. 4 : exit ENDOFMENU # ENDOFMENU 앞에 빈칸 없게 echo echo –n 'your choice? ' read reply case $reply in "1") date ;; "2"|"3") pwd ;; "4") stop=1 ;; *) # default. echo illegal choice ;; # error. esac done Unix/Linux
22
4.6 제어구조 제어구조: for for-do-done for name [ in { word } * ] do list done
단어 리스트안의 각 맴버에 대해 명령의 집합을 한번씩 실행 for name [ in { word } * ] do list done Unix/Linux
23
4.6 제어구조 제어구조: for (예) $ cat for.bash ...스크립트 내용 표시
for color in red yellow green blue do echo one color is $color done $ for.bash 스크립트 실행 one color is red one color is yellow one color is green one color is blue Unix/Linux
24
4.6 제어구조 제어구조: if-then-fi if-then-fi if list1 then list2
elif list elif는 여러번 반복가능함 then list4 else list else는 1번 이하 발생함 fi Unix/Linux
25
4.6 제어구조 제어구조: if-then-fi $ cat if.bash echo -n ‘enter a number : ’
read number if [ $number -lt 0 ] then echo negative $number < 0 이면 음수 elif [ $number -eq 0 ] then echo zero $number = 0 이면 else echo positive fi $ if.sh 스크립트 실행 enter a number : l positive $ if.sh 스크립트 다시 실행 enter a number : -l negative Unix/Linux
26
trap [ [ command ] { signal } + ]
번호가 붙여진 signal을 받을 때마다 셸에게 command 를 실행 하도록 지시. 여러 개의 signal이 받아들여지면 번호순으로 trap됨 ($ kill –l 로 signal 확인) signal 번호 0이 지정되면, 셸이 종료(exit)됐을 때 command가 실행됨[신호는 참고서적 p565 참조] 단 SIGKILL(9) 과 SIGSTOP(Unix: 23, Linux:19)은 trap 할 수 없음 (예) $ cat trap.bash trap ‘echo Control-C by me; exit 2’ 2 while : do echo infinite loop sleep 2 Done # 2(interrupt)신호가 수신되면 ‘ ’로 둘러싸인 명령어가 실행됨 $ echo $? trap [ [ command ] { signal } + ] Unix/Linux
27
메타문자(meta character): 제어용 특수문자
stty -a/all 현재 사용 중인 터미널의 메타문자들을 보여줌 erase(한 문자 지우기 ^H) kill(한 줄 지우기 ^U) werase(마지막 단어 지우기 ^w) rprint(현재 줄 재출력 ^R) flush(대기 입력 무시, 재출력 ^O) lnext(다음 문자를 특수문자로 보지 않음 ^V) susp/dsusp(프로세스 일시 정지 ^Z/^Y) intr(core dump 없이 작업 전면중단 ^C) quit(core dump 하고 작업 전면중단 ^\) stop/start(터미날 출력을 정지/재시작 ^S/^Q) eof(입력 끝 ^D) (예) $ stty erase “^H” (bash 셸에서는 안됨) $ stty –echo $ stty echo $ stty sane (원래대로 설정, 제어 문자 할당은 제외) Unix/Linux
28
제어구조: until-do-done 4.6 제어구조 until-do-done until list1 do list2 done
list1의 명령어를 실행하고 참이나 0이 아닌 값을 반환할 때까지 list2의 명령을 실행함 until list1 do list2 done Unix/Linux
29
제어구조: until-do-done 4.6 제어구조
(예) $ cat until.bash x=1 until [ $x -gt 3 ] $x가 3보다 크면 참 do echo x = $x x=`expr $x + 1` done $ until.bash x = 1 x = 2 x = 3 Unix/Linux
30
제어구조: while-do-done 4.6 제어구조 while-done while list1 do list2 done
list1의 의 조건이 만족되는 동안 list2의 명령을 반복 실행함 while list1 do list2 done Unix/Linux
31
제어구조: while-do-done 4.6 제어구조
(예) $ cat while.bash x=1 while [ $x -le 3 ] $x가 3보다 작으면 참 do echo x = $x x=`expr $x + 1` done $ while.bash x = 1 x = 2 x = 3 Unix/Linux
32
4.8 그 밖의 내장명령어 그 밖의 내장명령어 read 명령어 표준 출력에서 변수의 라인을 읽음 null 명령어 set 명령어
어떤 연산도 수행하지 않음 (null builtin ‘:’ 으로 표기하고 항상 참을 돌려 줌) set 명령어 변수나 명령 라인 매개 변수를 지정하거나 모든 변수를 표시 set -ekntuvx { arg }* Unix/Linux
33
set set 옵션 (교재 p188 표 참조) $ set -v (verbose mode)
$ set -x (실행된 명령에 + +표시, 전달된 매개변수 내용 출력, 디버깅에 좋음) $ set - (-v와 -x를 무력화 시킴) $ set -- (double hyphens)로 매개변수 시작 알림 $ set -u (설정되지 않은 변수 만나면 에러 발생) (예) $ set - a b c $ echo $1 $ date 1999년 9월 29일 수요일 오후 02시 38분 03초 $ set -- `date` $ echo $6 KST $ echo (수) 10:10:20 KST Unix/Linux
34
set -x 명령 행 옵션으로 실행되는 디버깅 기능 쉘 명령 앞에서 변수 배정 정의하면 그 명령으로 변수 값이 export됨
$ cat set.bash set -vx a.c ls $1 set - echo notset=\"$notset\" echo goodbye $LOGNAME set -u $ set.sh b.c …?… 실제로 수행된 명령 앞에 ++ 표시 쉘 명령 앞에서 변수 배정 정의하면 그 명령으로 변수 값이 export됨 $ cat myname echo My name is $name and my argument is $1 $ name=mysung myname john set -k로 매개변수를 주어진 명령의 환경에 위치시킴 $ set -k $ myname name=mysung john Unix/Linux
35
개선점 4.9 개선점 Redirection: >&, 2>&, <&, <&-, >&-(표준출력 닫은 후 명령실행) 순차적 명령열: (cd /; pwd) 과 { cd /; pwd; } 서브셸에서 부모셸에서 … 반드시 빈칸과 ;으로 구분 명령줄 옵션 Bourne shell은 다음 명령 줄 옵션을 지원한다. 옵 션 의 미 -c string 명령 string을 실행하기 위해 셀 생성 -s 표준 입력으로부터 명령을 읽고 표준에러 채널로 메시지를 보내는 셀을 생성 -i SIGTERM, SIGINT, SIGQUIT 시그널이 모두 무시되는 것을 제외하면 –s 옵션과 같은 대화형 셀을 생성 Unix/Linux
36
(실습1) 전화번호부 411 유틸리티 전화번호부 411 유틸리티 작성(이름, 주소, 전화번호로 검색이 가능한 전화번호부 유틸리티를 아래의 두 경우에 대하여 각각 작성) 전화번호 데이터가 프로그램과 다른 파일 안에 있는 경우 전화번호 데이터가 프로그램과 같은 파일 안에 있는 경우 [Hint: here document] Unix/Linux
37
(실습2) 재귀(recursive) 프로그램
shift.bash #!/bin/bash echo first argument is $1, all arguments are $* shift shiftdemo #! /bin/bash if [ $# -eq 0 ] then echo Usage: shiftdemo arguments else echo $# : $* shift [ $# -gt 0 ] && shiftdemo fi if [ $# -le 1 ] then echo $1 temp=$1 echo `reversedemo $temp Unix/Linux
38
(실습3) reverse 프로그램 reverse.bash Reverserecur reverserecur2
#! /bin/bash list="" for arg do list="$arg $list" done echo $list Reverserecur #! /bin/bash if [ $# -le 1 ] then echo $1 else temp=$1 shift echo `reverserecur $temp fi reverserecur2 #! /bin/bash reverse() { if [ $# -le 1 ] then echo $1 else temp=$1 shift echo `reverse $temp fi } reverse $* #! /bin/bash if [ $# -le 9 ] then echo $9 $8 $7 $6 $5 $4 $3 $2 $1 else echo Usage $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 fi Unix/Linux
39
(참고) junk.ksh Unix/Linux
#! /bin/bash # junk script # Lorn shell version # author: Graham Glass # 9/25/91 # Initialize variables fileCount=0 # the number of files specified. listFlag=0 # set to 1 if the list option (-) is used. purgeFlag=0 # set to 1 if the purge (-p) option is used. fileFlag=0 # set to 1 if at least one file is specified. junk=~/.junk # the name of the junk directory. error () { # Display error message and quit cat << ENDOFTEXT echo Dear $USER, the usage of junk is as follows: echo junk -p means "purge all files" echo junk -l means "list junked files" echo junk <list of files> to junk them ENDOFTEXT exit 1 } # Parse command line for arg in $* do case $arg in "-p") purgeFlag=1 ;; "-l") listFlag=1 ;; "-*") echo $arg is an illegal option ;; *) fileFlag=1 fileList[$fileCount]=$arg # append to list let fileCount=fileCount+1 ;; esac done # Check for too many options let total=$listFlag+$purgeFlag+$fileFlag if (( total != 1 )) then error fi # If junk directory doesn't exist, create it if [[ ! (-d $junk) ]] 'mkdir' $junk # "mkdir $junk"is OK # Process options if (( listFlag == 1 )) 'ls' -lgF $junk exit 0 Fi if (( purgeFlag == 1 )) 'rm' $junk/* if ((fileFlag == 1 )) 'mv' ${fileList[*]} $junk # move files to junk directory. Unix/Linux
40
4.6 제어구조 (참고) track track [-ncount] [-tpause] userId
지정된 사용자의 로그인과 로그아웃 세션을 감시한다. Pause로 명시된 매초마다 시스템을 검색하여 현재 시스템에 들어와 있는 사용자의 목록을 만든다. count번의 검색이 완료될 때까지 수행 디폴트로 pause는 3초, count는 100번의 검색임 Unix/Linux
41
(참고) track pause=3 loopCount=100 error=0 for arg in $* do case $arg in
pause=`expr substr $arg 3 10` ;; -n*) loopCount=`expr substr $arg 3 10` *) user=$arg esac done if [ ! "$user" ] then error=1 fi if [ $error -eq 1 ] cat << ENDOFERROR usage: track [-n*] [-t*] userId ENDOFERROR exit 1 trap 'track.cleanup $$; exit $exitCode' 0 # exit trap 'exitCode=1; exit' 2 3 # INT/QUIT echo –n > .track.old.$$ count=0 while [ $count -lt $loopCount ] do who | grep $user | sort > .track.new.$$ diff .track.new.$$ .track.old.$$ | sed -f track.sed > .track.report.$$ # diff 한 줄 명령 if [ -s .track.report.$$ ] then echo track report for ${user}: cat .track.report.$$ fi mv .track.new.$$ .track.old.$$ sleep $pause count=`expr $count + 1` done Unix/Linux
42
(참고) track $ cat track.cleanup echo stop tracking
rm -f .track.old.$1 .track.new.$1 .track.report.$1 $ cat track.sed # 7장 p326 sed 참조 /^[0-9].*/d /^---/d s/^</login/ s/^>/logout/ Unix/Linux
43
(참고) diff [교재 p203 참조] diff [ -i -Dflag ] fileName1 fileName2
-i 대소문자의 구분을 무시한다(ignore) -Dflag C preprocessor를 위한 출력을 생성 출력 형태 1: 첨가(addition) firstStart a secondStart, secondStop > 두 번째 파일에서 첫 번째 파일로 첨가되어야 할 부분 출력 형태 2: 삭제(deletion) firstStart, firstStop d lineCount < 첫 번째 파일에서 제거되어야 할 줄들 firstStart와 firstStop은 첫 번째 파일의 줄 번호를 의미하고 secondStart와 secondStop은 두 번째 파일의 줄 번호를 의미 출력 형태 3: 변경(change) firstStart firstStop c secondStart, secondStop < 첫 번째 파일에서 치환되어야 할 줄 --- > 치환을 위하여 사용되어야 할 두 번째 파일의 줄 Unix/Linux
44
(참고) diff (예) $ diff lady1 lady2 (예) $ diff lady2 lady1
Unix/Linux
45
(참고) 스트림 편집: sed [교재 p334 참조]
스트림 편집, 하나 이상의 파일을 스캔하여 특정 조건에 맞는 모든 줄을 편집한다. 단순 반복 편집에 유용 sed [ -e script ] [ -f scriptfile ] { fileName }* -f scriptFile sed 편집 명령을 파일로 저장수행 -e script sed 편집 명령 지정 (script = 'sed 폅집 명령') sed 편집 명령 addressRange s/expr/str 정규식 expr이 첫번째 발생을 문자열 str로 대치 addressRange a/expr/str/g 모든 정규식 exp을 문자열 str로 대치 address r name address줄 뒤에 화일 name의 내용 덧붙이기 address i\ text address줄 뒤에 텍스트 text 삽입 addressRange d addressRange로 지정된 줄을 삭제 addressRange c\ text addressRange로 명시된 텍스트를 text로 치환 addressRange a\ text addressRange로 명시된 텍스트 뒤에 text를 첨가 만일 주소가 명시되어있지 않으면 모든 줄에 대하여 적용 Unix/Linux
46
(참고) sed (예) $ sed 's/^/ /' arms > arms.indent → 파일의 들여쓰기 실행
(예) $ sed 's/^ *//' arms.indent → 각 줄 앞에 있는 공백 제거 (예) $ sed '/a/d' arms → 정규식 'a'를 포함하는 모든 줄을 삭제 (예) $ sed '/\<a\>/d' arms → 단어 'a'를 포함하는 모든 줄을 삭제 (예) $ sed -e 's/^/<< /' -e 's/$/ >>/' arms → '<<'를 줄의 맨 앞에, '>>'를 줄의 맨 뒤에 삽입함 Unix/Linux
Similar presentations