sed
나는 처음에 다음과 같이 검색하고 바꾸는 방법을 배웠습니다.
sed -e 's/<stuff>/<replacement>/'
하지만 최근에 이러한 명령이 처음에 사용하는 명령 문자(가 아닌)에 따라 s
다른 작업을 수행한다는 것을 알게 되었습니다. 예를 들어:
sed -e 'g/<stuff>/<??>/'
스크립트 시작 부분에 사용할 수 있는 다양한 명령 은 무엇 sed
이며 해당 명령의 기능은 무엇입니까?
답변1
이 답변에는 내 것이 아닌 작업이 포함되어 있기 때문에 커뮤니티 위키 게시물로 만들었습니다. 이 답변에 자유롭게 참여해 주세요.
보이는 문자를 명령이라고 합니다. 수십 개가 있습니다. 이를 완전히 이해하려면 먼저 sed
관련된 구문과 용어 중 일부를 이해해야 합니다 . sed
용어(및 용어 포함
pattern space
) 에 대한 설명은 hold space
다음을 참조하세요.이것StackOverflow의 답변입니다.
sed 구문은 다음과 같습니다:
[address or range]command
줄 바꿈이나 세미콜론으로 구분하여 여러 명령을 연속적으로 실행할 수 있습니다(일부 명령은 줄 바꿈으로 구분해야 함).
명령에는 세 가지 유형이 있습니다.
- 주소나 범위를 허용하지 않는 것입니다.
- 하나의 주소를 받아들이거나 전혀 받아들이지 않는 것.
- 주소 범위를 허용하는 것.
sed
아래 맨페이지에서 거의 전체 명령 목록을 찾을 수 있습니다 sed(1)
. 저는 이러한 명령에 대해 더 나은 설명을 제공하기 위해 노력하고 있습니다.
0개의 주소 또는 1개의 주소 명령
이것들은 명령이다
=
- 현재 줄 번호를 인쇄합니다.a \<text>
- 포함된 각 줄 바꿈 앞에 백슬래시가 오는 텍스트를 추가합니다.i \<text>
- 백슬래시 앞에 각 삽입된 줄바꿈을 사용하여 텍스트를 삽입합니다.q [exit-code]
- 추가 입력을 처리하지 않고 즉시 sed 스크립트를 종료하고 자동 인쇄가 비활성화되지 않는 한 현재 패턴 공간을 인쇄합니다. 종료 코드 매개변수는 GNU 확장입니다.Q [exit-code]
- 입력을 처리하지 않고 즉시 sed 스크립트를 종료합니다. 이것은 GNU 확장입니다.r filename
-파일 이름에서 읽은 텍스트를 추가합니다.R filename
- 파일 이름에서 읽은 줄을 추가합니다. 이 명령을 호출할 때마다 파일에서 한 줄을 읽습니다. 이것은 GNU 확장입니다.
주소 범위 명령
b label
- label로 분기하며, label을 생략하면 스크립트 끝으로 분기합니다.c \ text
- 여기에 일부 내용을 교체합니다(맨페이지에서 가져오고sed(1)
형식이 지정되고 약간 수정됨). 선택한 줄은 텍스트로 선택되었으며 포함된 각 줄 바꿈 앞에는 백슬래시가 있습니다.d
- 패턴 공간을 삭제합니다. 다음 사이클을 시작하세요.D
- 패턴 공간에 개행 문자가 포함되어 있지 않으면 d 명령이 실행된 것처럼 일반적인 새 루프가 시작됩니다. 그렇지 않으면 패턴 공간에서 첫 번째 개행 문자까지 텍스트를 삭제하고 새 입력 라인을 읽지 않고 결과 패턴 공간을 사용하여 루프를 다시 시작합니다.h H
- 패턴 공간을 복사/추가하여 공간을 절약하세요.g G
- 예약된 공간을 패턴 공간에 복사/추가합니다.l
- "시각적으로 명확한" 형식으로 현재 행을 나열합니다.l <width>
- 현재 행을 문자로 구분하여 "시각적으로 명확한" 형식으로 나열합니다. 이것은 GNU 확장입니다.n N
- 패턴 공간에 입력의 다음 줄을 읽거나 추가합니다.p
- 현재 패턴 공간을 인쇄합니다.P
- 현재 패턴 공간에 첫 번째 포함된 개행 문자를 인쇄합니다.s/regexp/replacement/
- 패턴 공간에 대해 정규식을 일치시키려고 시도합니다. 성공하면 교체와 일치하는 부분이 교체됩니다. 대체 항목에는 패턴 공간의 일치하는 부분을 나타내는 특수 문자 &와 정규식에서 일치하는 해당 하위 표현식을 나타내는 특수 이스케이프 문자 \1~\9가 포함될 수 있습니다.t label
-s///
입력 줄을 마지막으로 읽은 이후 명령이 성공적으로 교체된 경우 레이블로 분기하고 레이블이 생략된 경우 마지막 t 또는 T 명령 이후 스크립트 끝으로 분기합니다.T label
-s///
입력 줄을 마지막으로 읽은 이후 및 레이블이 생략된 경우 스크립트 끝까지 분기한 마지막 t 또는 T 명령 이후 대체를 성공적으로 완료한 명령이 없는 경우 레이블로 분기합니다. 이것은 GNU 확장입니다.w filename
- 파일명에 현재 패턴 공간을 씁니다.W filename
- 현재 패턴 공간의 첫 번째 줄을 파일 이름에 씁니다. 이것은 GNU 확장입니다.x
- 홀드 공간과 패턴 공간의 내용을 교환합니다.y/source/dest/
- 소스에 나타나는 패턴 공간의 문자를 대상의 해당 문자로 음역합니다.
이러한 명령에 대한 자세한 내용은 sed를 참조하세요.텍스트 정보 브로셔.
범위에 대한 참고 사항
일부 sed 명령은 주소 또는 주소 범위를 허용합니다. 예를 들어,
sed 1p
sed 입력의 첫 번째 줄을 인쇄합니다.
sed /foo/p
단어가 포함된 모든 줄을 인쇄합니다 foo
.
sed /foo/,/bar/p
foo
에서 까지의 모든 행을 인쇄합니다 bar
. 이는 여러 번 일치할 수 있습니다. 예를 들어,
$ cat file
foo
baz
bar
baz
foo
bar
$ sed -n /foo/,/bar/p
인쇄됩니다
foo
baz
bar
foo
bar