Linux 'sed' 명령은 스트림 편집기를 나타냅니다. 정규식을 사용하여 스트림(파일)을 편집하는 데 사용됩니다. 그러나 이 편집은 영구적이지 않습니다. 표시에만 남아 있지만 실제로 파일 내용은 동일하게 유지됩니다.
주로 텍스트 대체에 사용됩니다. 또한 삽입, 삭제, 검색 등과 같은 기타 텍스트 조작 작업에도 사용할 수 있습니다. sed 명령을 사용하면 파일을 열지 않고도 편집할 수 있습니다. 정규식 지원으로 더욱 강력한 텍스트 조작 도구가 됩니다.
sed 명령 개요
컴팩트하고 간단한 프로그래밍 언어로 텍스트를 변환하고 구문 분석하는 Unix 유틸리티입니다. 이는 1973년부터 1974년까지 Bell Labs의 Lee E. McMahon에 의해 통합되었으며 오늘날 거의 모든 운영 체제에 사용됩니다. sed 명령은 이전 qed(빠른 편집기) 및 ed 대화형 편집기의 스크립팅 측면을 기반으로 했습니다. 이는 정규식을 지원하는 최초의 도구였으며 가장 중요한 대체 명령을 통해 텍스트 처리에 여전히 활성화되어 있습니다. 유명한 대체 도구로는 Perl과 AWK가 있습니다. '스트림 편집' 및 일반 텍스트 문자열 조작.
sed 명령의 작동 모드
sed 명령은 텍스트 처리 라인 지향 유틸리티입니다. 이 명령은 파일이나 입력 스트림의 텍스트를 한 줄씩 읽어 패턴 공간이라는 내부 버퍼로 보냅니다. 모든 라인 읽기는 주기를 시작합니다. sed 명령은 sed 스크립트에 의해 패턴 공간에 설명된 하나 이상의 작업을 사용합니다. 텍스트에 대한 작업을 설명하는 약 25개의 명령을 사용하여 프로그래밍 언어를 작동합니다.
자바 목록 정렬
모든 입력 라인에 대해 sed 명령은 일반적으로 패턴 공간을 생성하고 스크립트를 실행한 후 다시 다음 라인으로 주기를 시작합니다. 다른 스크립트 종료 특성은 스크립트 명령 및 설정 옵션에서 사용할 수 있습니다. 예를 들어 다음 줄을 패턴 공간에 즉시 포함하려면 N, 종료하려면 q, 패턴 공간을 제거하려면 d 등을 사용합니다. 따라서 sed 스크립트는 루프 변수와 루프 자체가 sed에 의해 유지되고 암시되는 유선형에서 반복되는 루프 본문과 관련됩니다.
- sed 스크립트는 명령줄에서 설명하거나 격리된 파일을 통해 읽을 수 있습니다. sed 스크립트에서 명령은 정규식이나 줄 번호의 맥락에서 추가 주소를 사용할 수 있습니다. 주소는 명령이 실행되는 시기를 결정합니다. 예를 들어, 2d는 두 번째 입력 줄에서만 d(또는 삭제) 명령을 실행하는 반면, /^ /d는 공백으로 시작하는 모든 줄을 제거합니다.
- 격리된 특수 버퍼인 보관 공간은 일부 sed 명령에서 주기 사이에 누적되는 텍스트를 보관하는 데 사용될 수 있습니다. sed의 명령 언어에는 두 개의 변수(패턴 공간과 홀드 공간)만 있고 GOTO와 유사한 분기 기능이 있습니다. 그러나 언어는 Turing-complete입니다. 난해한 sed 스크립트는 테트리스, 체스, 아르카노이드, 소코반과 같은 여러 게임에 사용할 수 있습니다.
- 메인 루프는 입력 스트림의 모든 라인에 대해 실행되어 입력의 모든 라인에서 sed 스크립트를 확인합니다. sed 스크립트 줄은 모두 패턴-작업 쌍으로, 일치 패턴과 구현할 작업을 나타내며 조건문으로 복사할 수 있습니다. 기본 작업(패턴 공간 인쇄, 패턴 공간에 줄 복사), 입력 및 출력 스트림, 작업 변수(홀드 공간 및 패턴 공간)는 암시적입니다. 메인 루프 때문에 간결한 한 줄짜리 프로그램을 지정하는 것이 가능합니다.
sed 명령 사용법
- 캐럿(^)은 줄의 시작과 동일합니다.
- 달러 기호($)는 줄 완성과 동일합니다.
- 별표(*)는 이전 문자 발생과 동일하거나 0개 이상입니다.
- 더하기 기호(+)는 이전에 나온 하나 이상의 문자와 동일합니다.
- 물음표(?)는 이전 문자 발생과 동일하거나 0개 이상입니다.
- 점 기호(.)는 한 문자와 완전히 동일합니다.
아래 예는 sed 명령의 가장 일반적인 사용, 즉 대체를 나타냅니다. 사용법은 sed 명령의 실제 동기였습니다.
sed 's/regexp/replacement/g' inputFileName > 출력파일 이름
25개의 sed 명령을 사용하여 간단한 처리를 위한 다른 방법도 가능합니다. 예를 들어, 아래에서는 공백과 줄 문자 끝만 포함하는 줄을 필터링하기 위해 d 옵션을 사용합니다.
sed '/^ *$/d' 입력파일이름
위의 예에서는 아래 정규식 메타 문자 중 몇 가지를 사용합니다.
종종 sed 명령은 Unix의 파이프라인 내부에서 필터로 사용됩니다.
$생성데이터 | sed 's/x/y/g'
generateData 프로그램은 데이터를 생성하고 sed 명령은 y 대신 x를 대체하여 약간의 변경을 수행합니다.
많은 sed 명령(각 줄당 단일 명령)을 스크립트 파일 내에 넣고 -f 플래그를 사용하여 파일에서 명령을 실행하는 것이 도움이 되는 경우가 많습니다.
sed -f subst.sed 입력 파일 이름 > 출력 파일 이름
통사론:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
옵션:
다음은 sed 명령의 일부 명령줄 옵션입니다.
-n, --quiet, --silent: 이는 강제로 패턴 공간을 인쇄할 수 있게 해줍니다.
-e 스크립트, --expression=스크립트: 실행할 명령에 스크립트를 추가하는 데 사용됩니다.
-f 스크립트 파일, --file=스크립트 파일: 실행할 명령에 스크립트 파일의 내용을 추가하는 데 사용됩니다.
--follow-symlinks: 제자리에서 처리할 때 심볼릭 링크를 따르는 데 사용됩니다.
-i[SUFFIX], --in-place[=SUFFIX]: 파일을 제자리에서 편집하는 데 사용됩니다(SUFFIX 옵션이 제공되면 백업 생성).
-l N, --line-length=N: 이는 `l' 명령에 대해 원하는 줄 바꿈 길이를 지정하는 데 사용됩니다.
--posix: 모든 GNU 확장을 비활성화하는 데 사용됩니다.
-E, -r, --regexp-확장: 이를 통해 스크립트에서 확장 정규식을 사용할 수 있습니다(이식성을 위해 POSIX -E 사용).
-s, --separate: 파일을 단일이 아닌 별도의 것으로 간주하고 긴 스트림을 계속하는 데 사용됩니다.
--모래 상자: 샌드박스 모드에서 작동하는 데 사용됩니다.
-u, --버퍼링되지 않음: 입력 파일에서 최소한의 데이터를 로드하는 데 사용되며 출력 버퍼를 더 자주 플러시합니다.
-z, --null-데이터: NUL 문자로 줄을 구분하는 데 사용됩니다.
--돕다: 도움말 매뉴얼을 표시하는 데 사용됩니다.
--버전: 버전 정보를 표시하는데 사용됩니다.
sed 명령의 예
다음 예를 살펴보겠습니다.
STDIN 디렉터리에 적용
sed 명령은 파일 조작에만 국한되지 않습니다. 또한 이를 STDIN 디렉터리에 적용할 수도 있습니다.
echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/'
위 명령은 첫 번째 텍스트를 두 번째 텍스트 패턴으로 바꿉니다. 아래 출력을 고려하십시오.
위 출력에서 먼저 'class7' 문자열에 'sed' 명령을 수행했습니다. 여기서 'class'는 'jtp'로, 7은 10으로 변경되었습니다. 그런 다음 스트림 'msg.txt에서 'sed' 명령을 수행했습니다. ' 여기서 '배우다'는 '공부하다'로 변환됩니다.
전역 교체
이전 예에서는 모든 'learn' 단어가 'study'로 편집되지 않았습니다. 모든 단어를 편집하려면 전역 대체 'g'를 사용해야 합니다. 파일이나 문자열에 지정된 모든 단어를 편집합니다.
통사론:
command | sed 's///g'
아래 예를 고려하십시오.
echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g'
위의 명령은 지정된 모든 텍스트 패턴을 대체합니다. 아래 출력을 고려하십시오.
위 출력에서 'echo class7 class9 | sed 's/class/jtp/g'' 모든 'class'는 'jtp'로 변환되고 'cat msg.txt | sed 's/learn/study/g'' 모든 'learn'이 'study'로 변환되었습니다.
라인 제거
'd' 옵션을 사용하면 파일에서 전체 줄을 제거할 수 있습니다. 'd' 옵션을 사용하여 해당 줄에서 단어를 지정하기만 하면 해당 줄이 삭제됩니다. 단, 동일한 단어가 포함된 줄은 모두 삭제되므로 주의하세요. 다음과 같이 실행됩니다:
cat | sed '//d'
아래 명령을 고려하십시오.
cat msg.txt | sed '/jtp/d'
위 명령은 'jtp'라는 단어가 포함된 줄을 삭제합니다. 아래 출력을 고려하십시오.
위 출력에서 'cat msg.txt | sed '/jtp/d'' 'jtp'라는 단어가 포함된 모든 줄이 삭제됩니다.
다중 sed 명령 사용
'-e' 옵션을 사용하면 여러 sed 명령을 한 번에 실행할 수 있습니다. 다음과 같이 명령을 실행하여 두 개 이상의 sed 작업을 수행할 수 있습니다.
sed -e ' ; '
아래 명령을 고려하십시오.
sed -e 's/red/blue/; s/yellow/black/' exm.txt
위 명령은 'exm.txt' 파일에 지정된 모든 작업을 적용합니다. 아래 출력을 고려하십시오.
위 출력에서 볼 수 있듯이 '빨간색' 단어는 모두 '파란색'으로 대체되고, '노란색' 단어는 모두 '검은색'으로 대체됩니다. 다음과 같이 명령을 분리할 수도 있습니다.
sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt
결과는 위의 명령과 동일합니다.
파일에서 명령 읽기
sed 명령을 파일에 저장하고 모든 파일에 한 번에 적용할 수 있습니다. 다음과 같이 '-f' 옵션을 지정하면 됩니다.
sed -f
위 명령에서 ''는 sed 명령 목록이 포함된 파일입니다. 아래 명령을 고려하십시오.
sed -f SedCommands exm.txt
위 명령은 'exm.txt'의 'SedCommand' 파일에 지정된 모든 명령을 적용합니다. 아래 출력을 고려하십시오.
자바를 인쇄하는 방법
위 출력에서 이전 예제에 적용된 명령을 사용했습니다. 따라서 출력은 이전 예제와 동일합니다.
문자 교체
느낌표(!)를 문자열 구분 기호로 사용할 수 있습니다. 예를 들어, bash 쉘을 '/etc/passwd'에서 csh 쉘로 교체하려고 합니다. 그렇게 하려면 아래 명령을 실행하십시오.
sed 's//bin/bash//bin/csh/' /etc/passwd
아래 명령을 실행하여 동일한 결과를 얻을 수 있습니다.
sed 's!/bin/bash!/bin/csh!' /etc/passwd
sed 제한
sed 명령의 기본 사용은 전체 파일을 처리합니다. 그러나 sed 명령을 제한하고 모든 행을 지정할 수 있습니다. sed 명령을 제한하는 방법에는 두 가지가 있습니다.
- 다양한 라인.
- 특정 라인과 일치하는 패턴입니다.
다음과 같이 행을 지정하기 위해 숫자를 제공할 수 있습니다.
sed '3s/Red/Blue/' exm.txt
위 명령은 세 번째 줄에 지정된 작업을 적용합니다. 아래 출력을 고려하십시오.
위 출력에서는 3행만 수정되었습니다.
또한 행의 범위를 지정할 수도 있습니다. 행 범위를 지정하려면 다음과 같이 명령을 실행하십시오.
sed '1,3s/Red/Blue/' exm.txt
위 명령은 1행과 3행에 지정된 텍스트를 업데이트합니다. 아래 출력을 고려하세요.
텍스트 삽입 및 추가
'i' 및 'a' 플래그는 파일에 텍스트를 삽입하고 추가하는 데 사용됩니다. 'i' 플래그는 문자열 앞에 텍스트를 추가하고 'a' 플래그는 문자열 뒤에 텍스트를 추가하는 데 사용됩니다. 아래 명령을 고려하십시오.
echo 'Another Demo' | sed 'iFirst Demo'
위 명령은 'Another Demo' 텍스트 앞에 텍스트를 삽입합니다. 아래 출력을 고려하십시오.
텍스트를 추가하려면 다음과 같이 명령을 실행합니다.
echo 'Another Demo' | sed 'aFirst Demo'
위의 명령은 텍스트를 추가합니다. 아래 출력을 고려하십시오.
라인 수정
'c' 플래그는 특정 줄을 수정하는 데 사용됩니다. 줄을 수정하려면 다음과 같이 명령을 실행합니다.
sed '3cThis is a modified line.' exm.txt
위 명령은 세 번째 줄을 업데이트합니다. 아래 출력을 고려하십시오.
또한 정규식을 사용하여 동일한 패턴을 가진 두 개 이상의 줄을 업데이트할 수도 있습니다. 아래 명령을 고려하십시오.
Java에 설정된 경로
sed '/Apple is /c Line updated.' exm.txt
위 명령은 'Apple is'라는 문자열이 있는 모든 줄을 업데이트합니다. 아래 출력을 고려하십시오.
캐릭터의 변신
'y' 플래그는 문자를 변환하는 데 사용됩니다. 문자 변형은 특정 발생으로 제한될 수 없습니다. 문자를 변환하려면 다음과 같이 명령을 실행하십시오.
sed 'y/abc/def/' exm.txt
위 명령은 'a', 'b', 'c' 문자를 'd', 'e', 'f'로 변환합니다. 아래 출력을 고려하십시오.
줄 번호 인쇄
'=' 기호는 줄 번호를 인쇄하는 데 사용됩니다. 줄 번호를 인쇄하려면 다음과 같이 명령을 실행하십시오.
sed '=' exm.txt
위 명령은 파일 내용의 줄 번호를 표시합니다. 아래 출력을 고려하십시오.
'-n' 옵션이 있는 등호는 일치하는 스크립트가 포함된 줄 번호를 지정합니다. 아래 출력을 고려하십시오.
sed -n '/mango/=' exm.txt
위 명령은 'mango'라는 단어가 포함된 줄 번호를 표시합니다. 아래 출력을 고려하십시오.
위 출력에서 라인 번호 2에 'mango' 단어가 있음을 알 수 있습니다.