본문 바로가기
Linux

리눅스 명령어 sed 옵션 설명과 사용 방법

by 정권이 내 2023. 11. 13.

리눅스 명령어 sed 옵션 설명과 사용 방법

 

sed 명령어

sed는 유닉스 명령어로, 유닉스나 리눅스 OS에서 파일내의 텍스트 특정 패턴을 찾아서 원하는 형식으로 변경하거나 추출하는 데 사용됩니다.

특정 문자열을 기준으로 행을 제거 하거나 텍스트 치환, 줄 삭제/추가, 특정 라인 출력 등등 다양한 텍스트 처리가 가능합니다.

 

 

sed 옵션 설명

-n, --quiet, --silent

결과를 출력하지 않고 파일의 내용을 수정합니다.

sed -n 's/Hello/Goodbye/g' test.log

 

-n을 사용하지 않으면 결과가 출력됩니다.

sed 's/Hello/Goodbye/g' test.log
Goodbye
Goodbye
Goodbye

 

-f script-file, --file=script-file

sed 명령어가 있는 파일을 지정합니다. 파일에는 sed 명령어를 여러개 사용할수 있습니다.

 

Change.sed

s/Hello/Goodbye/g
s/Goodbye/HelloWorld/g

 

sed -f Change.sed test.log
HelloWorld
HelloWorld
HelloWorld

 

-e script, --expression=script

sed 명령을 여러개 사용할때 사용합니다. 각 명령어는 -e 뒤에 따라오는 스크립트로 지정됩니다.

sed -e 's/Hello/Goodbye/g' -e 's/Goodbye/Hello/g' test.log
Hello
Hello
Hello

 

-i[SUFFIX], --in-place[=SUFFIX]

원본 파일을 직접 편집하며, 변경 내용을 원본 파일에 즉시 반영합니다. SUFFIX는 백업 파일의 확장자를 지정합니다.

아래 명령어를 실행하면 test.log의 백업파일인 test.log.bak 파일이 생성되고 test.log 파일의 내용은 변경됩니다.

# 백업파일 확장자 .bak 지정
sed -i.bak -f HelloToGoodbye.sed test.log

# 백업파일 지정 안함
sed -i -f HelloToGoodbye.sed test.log

 

 

-E, -r, --regexp-extended

확장 정규 표현식을 사용할 때 필요한 옵션입니다. 일반적인 정규 표현식 대신 확장된 문법을 사용할 수 있습니다.

아래 명령어는 years 앞에 숫자패턴이 있는 경우 years를 yrs로 변경하는 명령입니다.

 

regexp.log

1 years 21 month
2 years 22 month
3 years 23 month
4 years 24 month
5 years 25 month

 

sed -r 's/([0-9]+) years/\1 yrs/' regexp.log
1 yrs 21 month
2 yrs 22 month
3 yrs 23 month
4 yrs 24 month
5 yrs 25 month

 

sed 역참조 \<n>

이때 sed 명령어에서 \1은 sed 에서 사용되는 역참조(Backreference)입니다. 역참조는 정규 표현식에서 괄호로 묶인 그룹을 나타내며, 매칭된 텍스트의 해당 그룹을 참조할 때 사용됩니다.

([0-9]+)는 하나 이상의 숫자로 이루어진 그룹을 나타냅니다. 이 그룹은 괄호로 묶여 있으며, 이는 역참조의 대상이 됩니다. 만약 "10 years"와 같은 문자열이 있다면, ([0-9]+)는 "10" 이라는 그룹에 해당합니다. 그리고 \1은 첫 번째 그룹을 나타내므로 "10"으로 대체됩니다.

정규표현식이 2개가 있다면 역참조 역시 2개를 지정할수 있습니다.

sed -r 's/([0-9]+) years ([0-9]+) month/\1 yrs \2 mon/' regexp.log
1 yrs 21 mon
2 yrs 22 mon
3 yrs 23 mon
4 yrs 24 mon
5 yrs 25 mon

 

-u, --unbuffered

줄 단위로 버퍼링을 하지 않습니다. 주로 대용량의 텍스트 데이터를 처리할 때 사용됩니다.

sed -u 's/old/new/g' test.log

 

-s, --separate

각 입력 파일에 대해 스크립트를 별도로 처리합니다. 여러 파일을 처리할 때 사용됩니다.

sed -s 's/old/new/g' file1.txt file2.txt

 

 

sed 응용하기

특정 패턴 or 문자열을 포함한 라인 삭제 d

sed '/<pattern>/d' test.log

 

test.log

Apple
Banana
Orange1

 

# Banana 문자열이 포함된 라인 삭제
sed '/Banana/d' test.log
Apple
Orange

 

# 숫자패턴이 포함된 라인 삭제
sed -r '/([0-9]+)/d' test.log
Apple
Banana

 

특정 패턴 or 문자열을 포함한 라인 제외 삭제 !d

위 와는 반대로 특정 문자열이나 패턴을 포함한 라인을 제외하고 삭제하는 명령입니다.

sed '/<pattern>/!d' test.log

 

test.log

Apple
Banana
Orange1

 

# Banana 문자열을 포함한 라인 제외하고 삭제
sed '/Banana/!d' test.log
Banana

 

특정 패턴 or 문자열이 포함된 라인부터 n줄 삭제

텍스트 파일에서 특정 문자열을 찾고 +n는 해당 문자열을 찾은 라인을 포함하여 이하 n줄을 제거하겠다는 의미 입니다.

# 특정 패턴부터 아래로 n라인 삭제
sed '/<pattern>/,+n d' test.log

 

test.log

Top1
Top2
Top3
Middle
Bottom1
Bottom2
Bottom3

 

# Middle 문자열이 있는 라인을 포함하여 1줄 삭제
sed '/Middle/,+1 d' test.log
Top1
Top2
Top3
Bottom2
Bottom3

 

특정 범위 라인 출력

# test.log 파일의 n번 라인부터 m번 라인까지 출력합니다.
sed -n '<n>,<m>p' test.log

 

test.log

HelloWorld1
HelloWorld2
HelloWorld3
HelloWorld4
HelloWorld5

 

sed -n '2,4p' test.log
HelloWorld2
HelloWorld3
HelloWorld4

 

 

라인 시작, 끝에 특정 문자열 추가

# 라인 시작에 특정 문자열 추가
sed 's/^/<string>/' test.log

# 라인 끝에 특정 문자열 추가
sed 's/$/<string>/' test.log

 

test.log

World
World
World

 

sed 's/^/Hello/' test.log
HelloWorld
HelloWorld
HelloWorld

 

test.log

Hello
Hello
Hello

 

sed 's/$/World/' test.log
HelloWorld
HelloWorld
HelloWorld

 

내용 정리

sed 명령어는 텍스트 파일에서 특정 패턴을 찾아서 원하는 형식으로 변경하거나 추출하는 데 사용됩니다.

특정 문자열을 기준으로 행을 제거 하거나 텍스트 치환, 줄 삭제/추가, 특정 라인 출력 등등 다양한 텍스트 처리가 가능합니다.

반응형

댓글