sed 요리책

16808 단어 cookbooksedtutorial

목차


  • Write the result to another file
  • Replace first occurrence on every line
  • Replace values of all occurrences
  • Replace value of first occurrence in the file
  • Replace all occurrences on n-th line
  • Replace all occurrences within a range of lines
  • Replace all occurrences on every line matching pattern
  • Replace all occurrences on every line NOT matching pattern
  • Replace first occurrence after a pattern
  • Delete lines matching pattern
  • Delete n-th line
  • Insert before line
  • Insert after line
  • Use other delimiter

  • 결과를 다른 파일에 쓰기

    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 sed
  • b - 패턴 공간에 t 가 없으면 스크립트 끝으로 점프합니다.
  • /server-beta/! b - 이름이 있는 레이블 선언 server-beta
  • :label1 - label1s/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 다른 구분 기호 사용

    좋은 웹페이지 즐겨찾기