sed 요리책
목차
결과를 다른 파일에 쓰기
Content of file_1
(before command is executed)
Hello World
Command
sed 's/Hello/Goodbye/;w file_2' file_1
Content of file_1
(after command is executed)
Hello World
Content of file_2
(after command is executed)
Goodbye World
모든 항목에서 첫 번째 항목 바꾸기
Input file
aa
bb bb
aa
bb
Command
sed 's/bb/dd/' file
Output
aa
dd bb
aa
dd
모든 항목의 값 바꾸기
Input file
aa
bb bb
aa
bb
Command
sed 's/bb/dd/g' file
Output
aa
dd dd
cc
dd
파일에서 처음 나타나는 값 바꾸기
Input file
aa
bb bb
aa
bb
Command
It only works on GNU sed.See also: https://www.gnu.org/software/sed/manual/html_node/Range-Addresses.html
sed '0,/bb/{s/bb/dd/}' file
산출
aa
dd bb
cc
bb
n번째 줄의 모든 항목 바꾸기
Input file
aa
bb bb
aa
bb
Command
# replace all occurrences on 2nd line
sed '2s/bb/dd/g' file
Output
aa
dd dd
aa
bb
줄 범위 내에서 모든 항목 바꾸기
Input file
aa1
aa2
aa3
aa4
aa5
Command
# replace occurrences from 2nd line to 4th line
sed '2,4s/aa/dd/g' file
Output
aa1
dd2
dd3
dd4
aa5
패턴과 일치하는 모든 줄에서 모든 항목 바꾸기
Input file
a 1
a 2
a 1 x
b 1
b 2
b 1 x
c 1
c 2
c 1 x
Command
# replace "1" with "10" on all the lines containing "b"
sed '/b/s/1/10/g' file1
Output
a 1
a 2
a 1 x
b 10
b 2
b 10 x
c 1
c 2
c 1 x
패턴과 일치하지 않는 모든 줄의 모든 항목 바꾸기
Input file
a 1
a 2
a 1 x
b 1
b 2
b 1 x
c 1
c 2
c 1 x
Command
# replace "1" with "10" on all the lines NOT containing "b"
sed '/b/!s/1/10/g' file
Output
a 10
a 2
a 10 x
b 1
b 2
b 1 x
c 10
c 2
c 10 x
패턴 뒤 첫 번째 항목 바꾸기
Input file
server-alpha:
host: '192.168.0.1'
port: 9090
server-beta:
host: '192.168.0.1'
port: 9091
server-charlie:
host: '192.168.0.1'
port: 9092
Problem
Change the host of server-beta
to 192.168.0.2
. Values of other hosts remain unchanged.
Command
sed -e '/server-beta/! b' \
-e ':label1' \
-e 's/192.168.0.1/192.168.0.2/' \
-e 't label2' \
-e 'n' \
-e 'b label1' \
-e ':label2' \
-e 'n' \
-e 'b label2' \
file
Output
server-alpha:
host: '192.168.0.1'
port: 9090
server-beta:
host: '192.168.0.2'
port: 9091
server-charlie:
host: '192.168.0.1'
port: 9092
Explanation
It uses the sedb
- 패턴 공간에 t
가 없으면 스크립트 끝으로 점프합니다. /server-beta/! b
- 이름이 있는 레이블 선언 server-beta
:label1
- label1
를 s/192.168.0.1/192.168.0.2/
192.168.0.1
- 이전 교체가 완료되면 192.168.0.2
로 이동합니다. t label2
- 입력에서 다음 줄을 읽고 패턴 공간에 넣거나 입력에서 더 이상 줄이 없으면 종료label2
- n
b label1
- 이름이 있는 레이블 선언 label1
:label2
- 입력에서 다음 줄을 읽고 패턴 공간에 넣거나 입력에서 더 이상 줄이 없으면 종료label2
- n
의사 코드
input = readLineFromInput()
while (input != null) {
patternSpace.append(input)
if (patternSpace.contains("server-beta")) {
while (true) { // label1
if (patternSpace.replace("192.168.0.1", "192.168.0.2")) {
break // jump to label2
}
/** start of n **/
display(patternSpace)
patternSpace.clear()
input = readLineFromInput()
if (input == null) {
exit
}
patternSpace.append(line)
/** end of n **/
}
while (true) { // label2
/** start of n **/
display(patternSpace)
patternSpace.clear()
input = readLineFromInput()
if (input == null) {
exit
}
patternSpace.append(line)
/** end of n **/
}
}
display(patternSpace)
patternSpace.clear()
input = readLineFromInput()
}
분기 명령 패턴과 일치하는 라인 삭제
입력 파일 aa1 bb2 CC3 명령 sed /bb/d 파일 산출 aa1 CC3 n번째 줄 삭제
입력 파일 aa1 aa2 aa3 aa4 aa5 명령 # 두 번째 줄 삭제 sed 2d 산출 aa1 aa3 aa4 aa5 줄 앞에 삽입
입력 파일 aa1 bb2 CC3 명령 sed "/bb/i bb_before" 파일 산출 aa1 bb_before bb2 CC3 줄 뒤에 삽입
입력 파일 aa1 bb2 CC3 명령 sed "/bb/a bb_after" 파일 산출 aa1 bb2 bb_after CC3 다른 구분 기호 사용
Reference
이 문제에 관하여(sed 요리책), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/franzwong/sed-cookbook-4kkc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)