리눅스 명령어 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 명령어는 텍스트 파일에서 특정 패턴을 찾아서 원하는 형식으로 변경하거나 추출하는 데 사용됩니다.
특정 문자열을 기준으로 행을 제거 하거나 텍스트 치환, 줄 삭제/추가, 특정 라인 출력 등등 다양한 텍스트 처리가 가능합니다.
'Linux' 카테고리의 다른 글
Linux alternatives 명령어로 JDK 버전 관리하기 (0) | 2024.11.15 |
---|---|
Linux 시작 프로그램 관리: chkconfig 개념과 사용 방법 (0) | 2024.11.14 |
패키지 관리자 Yum Repository 사용 방법 (0) | 2023.11.13 |
[Linux] 하위 디렉토리 파일 내용 일괄변경 sed 명령 사용방법 (0) | 2022.04.05 |
[Linux] 심볼릭링크(Symbolic link) 만들기 ln -s (0) | 2022.01.27 |
댓글