링크 ux 명령 학습 (2) -- sed

10916 단어
학습 자료: < linux 하우스 명령 백 편 상 >
뭐 공부 해요?
sed 는 stream editor 의 줄 임 말 입 니 다. 번역 하면 '스 트림 편집기' 이 고 실제 적 으로 그 역할 도 설명 한 것 과 같 습 니 다.sed 명령 은 행 처 리 를 위 한 도구 로 행위 처리 단위 로 강력 한 처리 능력 을 실현 할 수 있 습 니 다.sed 는 모든 줄 을 처리 한 후에 표준 출력 으로 출력 합 니 다. 우리 가 볼 수 있 는 각도 에서 sed 는 수 정 된 내용 을 셸 에 출력 하고 원본 파일 을 수정 하지 않 습 니 다 (물론 원본 파일 을 수정 하려 면 가능 합 니 다).
수학 을 공부 하 는 것 처럼 sed 의 용법 은 하나의 공식 으로 요약 할 수 있다. sed [选项] command file 그 중에서:
  • command: 파일 의 줄 마다 (또는 줄 선택) 동작 합 니 다.
  • file: 조작 할 파일 입 니 다.

  • sed 의 작업 원리
    sed 는 줄 에 따라 파일 을 처리 할 때 처리 할 줄 을 버퍼 에 넣 고 sed 명령 은 버퍼 의 내용 을 처리 합 니 다.처리 가 끝 난 후 버퍼 의 내용 을 화면 에 보 내 고 파일 이 끝 날 때 까지 다음 줄 을 처리 합 니 다.따라서 전체 처리 과정 에서 sed 작업 은 버퍼 의 내용 이기 때문에 원본 파일 을 수정 하지 않 습 니 다.
    다음은 작은 예 를 들 어 sed 의 매력 을 보 여 줍 니 다. 먼저 줄 번호 파일 을 포함 하 는 스 크 립 트 를 만 듭 니 다.
    #! /bin/bash
    for i in {1..5}
    do
        echo "hello linux $i" >> hello
    done
    

    스 크 립 트 를 실행 한 후 hello 파일 이 생 겼 습 니 다. 파일 내용 은 다음 과 같 습 니 다.
    wangsheng@ubuntu[18:47:21]:~/Documents$ sh file.sh
    wangsheng@ubuntu[18:47:26]:~/Documents$ cat hello
    hello linux 1
    hello linux 2
    hello linux 3
    hello linux 4
    hello linux 5
    

    만약 내 가 파일 의 두 번 째 줄 만 보고 싶다 면, sed 명령 으로 이렇게 쓸 수 있다.
    wangsheng@ubuntu[18:49:47]:~/Documents$ sed -n '2p' hello
    hello linux 2
    

    hello 파일 의 두 번 째 줄 만 표 시 됩 니 다.이 예 는 매우 간단 하 다. 단지 sed 의 기본 용법 을 보 여 주 었 을 뿐, 뒤에 sed 의 용법 에 대해 상세 하 게 설명 할 것 이다.여기 -n 는 sed 가 제공 하 는 옵션 입 니 다. '2p' 은 sed 의 command 부분 에서 두 번 째 줄 을 인쇄 하 는 것 을 표시 합 니 다.hello 는 file 부분 으로 hello 라 는 파일 을 조작 한 것 을 나타 낸다.
    sed 의 상세 한 용법
    수작 부 리 는 명령
    명령 은 sed 용법 에서 command 부분 입 니 다. sed 가 강력 한 기능 을 가 진 이 유 는 command 부분 이 매우 많은 모양 으로 조합 할 수 있 기 때 문 입 니 다.자주 사용 하 는 command 는 보통 두 부분 으로 구성 되 며, 일 부 는 범위 설정, 즉 줄 선택 입 니 다.다른 부분 은 동작 처리, 즉 선택 한 줄 에 대해 어떤 동작 을 수행 하 는 지 입 니 다.
    범위 설정
    범위 설정 은 말 그대로 sed 명령 이 어느 줄 이나 몇 줄 을 조작 해 야 하 는 지 입 니 다.주의해 야 할 것 은 줄 을 선택 하지 않 으 면 모든 줄 에 이 동작 을 기본적으로 실행 합 니 다.자주 사용 하 는 범위 설정 은 다음 과 같은 몇 가지 형식 이 있 습 니 다.
  • x: x 를 줄 번호 로 하여 x 행
    #显示第2行
    wangsheng@ubuntu[18:49:47]:~/Documents$ sed -n '2p' hello
    hello linux 2
    
  • 을 선정 하 는 것 을 나타 낸다.
  • x, y: x 행 에서 y 행
    #显示2-4行
    wangsheng@ubuntu[19:40:50]:~/Documents$ sed -n '2,4p' hello
    hello linux 2
    hello linux 3
    hello linux 4
    
  • x, $: x 행 에서 마지막 줄
    #显示第4行到最后一行
    wangsheng@ubuntu[19:44:41]:~/Documents$ sed -n '4,$p' hello
    hello linux 4
    hello linux 5
    
  • x,y!:지정 한 줄 번호 x 에서 y 까지 의 줄
    #显示除了第3行的所有行
    wangsheng@ubuntu[19:47:33]:~/Documents$ sed -n '3!p' hello
    hello linux 1
    hello linux 2
    hello linux 4
    hello linux 5
    
  • 을 포함 하지 않 습 니 다.
  • /pattern/: 이 모드 를 포함 하 는 줄 을 조회 합 니 다. 여기 pattern 는 정규 표현 식 을 사용 할 수 있 습 니 다.
    #查询显示含有5的行
    wangsheng@ubuntu[19:47:40]:~/Documents$ sed -n '/5/p' hello
    hello linux 5
    #查询显示含有linux的行
    wangsheng@ubuntu[19:50:47]:~/Documents$ sed -n '/linux/p' hello
    hello linux 1
    hello linux 2
    hello linux 3
    hello linux 4
    hello linux 5
    
  • x,/pattern/: 줄 번호 와 패턴 을 통 해 일치 하 는 줄 을 조회 하여 x 줄 에서 이 모델 과 일치 하 는 줄 까지 표시 합 니 다.

  • 동작 처리
    동작 처 리 는 우리 가 선택 할 수 있 도록 다양한 동작 을 제공 할 것 이 며, 이러한 동작 을 이용 하여 특정한 줄 의 내용 을 추가, 삭제, 수정 등 작업 을 할 수 있다.여기 서 자주 사용 하 는 동작 몇 가 지 를 소개 합 니 다.
  • p: 인쇄, 선택 한 줄 을 화면 에 출력 합 니 다.보통 p 매개 변수 sed -n 와 함께 사용 합 니 다.-n 옵션 의 역할 에 대해 서 는 sed 옵션 을 소개 할 때 자세히 설명 합 니 다.
    #源文件
    wangsheng@ubuntu[20:04:00]:~/Documents$ cat hello
    hello linux 1
    hello java 2
    hello c++ 3
    hello android 4
    hello php 5
    #显示第2行
    wangsheng@ubuntu[20:04:06]:~/Documents$ sed -n '2p' hello
    hello java 2
    #显示最后一行
    wangsheng@ubuntu[20:05:38]:~/Documents$ sed -n '$p' hello
    hello php 5
    #显示含有java的行
    wangsheng@ubuntu[20:16:25]:~/Documents$ sed -n '/java/p' hello
    hello java 2
    
  • a: 추가, a 의 뒤에 문자열 을 연결 할 수 있 습 니 다. 이 문자열 들 은 새로운 줄 에 나타 납 니 다. (현재 다음 줄) 여러 줄 을 추가 하려 면
    줄 바 꿈 자 를 사용 할 수 있 습 니 다.
    #在文件末添加一行hello python
    wangsheng@ubuntu[20:08:48]:~/Documents$ sed '$a hello python' hello
    hello linux 1
    hello java 2
    hello c++ 3
    hello android 4
    hello php 5
    hello python
    #使用
    可以添加换行,例如本例在含有android行的下一行添加了两行内容 wangsheng@ubuntu[20:17:39]:~/Documents$ sed '/android/a hello
    world' hello hello linux 1 hello java 2 hello c++ 3 hello android 4 hello world hello php 5
  • c: 줄 바 꾸 기, c 의 뒤에 문자열 을 연결 할 수 있 습 니 다. 이 문자열 들 은 n1, n2 사이 의 줄 을 바 꿀 수 있 습 니 다.
    #第2行替换为hello world
    wangsheng@ubuntu[20:09:00]:~/Documents$ sed '2c hello world' hello
    hello linux 1
    hello world
    hello c++ 3
    hello android 4
    hello php 5
    #第3行至最后一行替换为hello world
    wangsheng@ubuntu[20:11:06]:~/Documents$ sed '3,$c hello world' hello
    hello linux 1
    hello java 2
    hello world
    
  • d: 줄 을 삭제 합 니 다. 삭제 이기 때문에 d 뒤에 내용 이 연결 되 지 않 고 선택 한 줄 의 내용 을 삭제 합 니 다.
    #删除第1行
    wangsheng@ubuntu[20:12:58]:~/Documents$ sed '1d' hello
    hello java 2
    hello c++ 3
    hello android 4
    hello php 5
    #删除含有java的行
    wangsheng@ubuntu[20:19:05]:~/Documents$ sed '/java/d' hello
    hello linux 1
    hello c++ 3
    hello android 4
    hello php 5
    
  • s: 교체, 교체 작업 을 직접 찾 을 수 있 습 니 다.보통 s 는 정규 표현 식 을 조합 할 수 있다.형식: sed 's/要替换的字符串/新的字符串/g' (바 꿀 문자열 은 정규 표현 식 으로 사용 할 수 있 습 니 다)
    #搜索含有java的行,并将该行的java替换成javaee
    wangsheng@ubuntu[20:19:49]:~/Documents$ sed '/java/s/java/javaee/g' hello
    hello linux 1
    hello javaee 2
    hello c++ 3
    hello android 4
    hello php 5
    #也可以使用该功能删除某个字符串,例如本例将java替换成空即删掉了第2行的java
    wangsheng@ubuntu[20:25:13]:~/Documents$ sed '/java/s/java//g' hello
    hello linux 1
    hello  2
    hello c++ 3
    hello android 4
    hello php 5
    
    때때로 우 리 는 현재 줄 의 다음 줄 이나 이전 줄 에 내용 을 추가 하고 싶 지 않 고 줄 의 첫머리 나 줄 의 끝 에 내용 을 추가 하고 싶 을 때 어떻게 합 니까?
    사실 s 기능 을 사용 할 수 있 습 니 다.행수
    #在每行行首添加head------
    wangsheng@ubuntu[20:29:56]:~/Documents$ sed 's/^/head------/g' hello
    head------hello linux 1
    head------hello java 2
    head------hello c++ 3
    head------hello android 4
    head------hello php 5
    #在每行行尾追加------tail
    wangsheng@ubuntu[20:35:12]:~/Documents$ sed 's/$/------tail/g' hello
    hello linux 1------tail
    hello java 2------tail
    hello c++ 3------tail
    hello android 4------tail
    hello php 5------tail
    #在第1行行尾追加------tail
    wangsheng@ubuntu[20:35:36]:~/Documents$ sed '1s/$/------tail/g' hello
    hello linux 1------tail
    hello java 2
    hello c++ 3
    hello android 4
    hello php 5
    

    또 s 가 대표 교체 라면 끝의 g 는 무슨 뜻 일 까?
    사실 문자 g 는 줄 마다 나타 나 는 문 자 를 모두 바 꾸 는 것 을 의미 합 니 다. 특정한 문자 에 추가 하려 면 g 가 유용 합 니 다. 그렇지 않 으 면 줄 마다 첫 번 째 만 바 꾸 고 더 이상 찾 지 않 습 니 다.
  • r: 파일 삽입, 현재 줄 의 다음 줄 에 지정 한 파일 의 내용 을 삽입 할 수 있 습 니 다.
    #需要插入的文件内容
    wangsheng@ubuntu[20:28:34]:~/Documents$ cat foo
    +++this is file in foo+++
    #使用a动作插入时,只会将foo当做字符串插入
    wangsheng@ubuntu[20:27:46]:~/Documents$ sed '/java/a foo' hello
    hello linux 1
    hello java 2
    foo
    hello c++ 3
    hello android 4
    hello php 5
    #使用r命令插入时,会将foo代表的文件内容插入
    wangsheng@ubuntu[20:28:12]:~/Documents$ sed '/java/r foo' hello
    hello linux 1
    hello java 2
    +++this is file in foo+++
    hello c++ 3
    hello android 4
    hello php 5
    

  • 사용 하기 쉬 운 옵션
    방금 우 리 는 sed 명령 의 기본 구성 을 언급 했 습 니 다. 다음은 sed 에 어떤 재 미 있 는 옵션 이 있 는 지 살 펴 보 겠 습 니 다.
  • - n: 조용 (silent) 모드 를 사용 합 니 다.일반 sed 의 용법 에 서 는 stdIN 에서 온 모든 내용 이 화면 에 출력 됩 니 다.그러나 n 인 자 를 더 하면 sed 특수 처 리 를 거 친 줄 (또는 동작) 만 출력 됩 니 다.
    #使用-n选项,只会输出处理的那一行
    wangsheng@ubuntu[20:43:59]:~/Documents$ sed -n '/java/a ======' hello
    ======
    #不使用-n选项,输出所有行
    wangsheng@ubuntu[20:44:22]:~/Documents$ sed '/java/a ======' hello
    hello linux 1
    hello java 2
    ======
    hello c++ 3
    hello android 4
    hello php 5
    
  • - e: 내 가 수행 하고 자 하 는 동작 이 두 개 이상 포함 되면 어 떡 하지?이것 도 간단 합 니 다. sed 의 - e 속성 은 이 기능 을 지원 합 니 다. 모든 동작 전에 - e 옵션 을 추가 하면 됩 니 다.
    #前一个command输出1-2行,后一个command输出第4行
    #每个command之前均加上-e选项就可以同时处理两个动作了
    wangsheng@ubuntu[20:44:33]:~/Documents$ sed -n -e '1,2p' -e '4p' hello
    hello linux 1
    hello java 2
    hello android 4
    
  • - f: command 부분 이 너무 길 면 command 부분 내용 을 하나의 단독 파일 에 쓴 다음 - f 옵션 을 사용 하여 이 파일 을 sed 명령 의 command 부분 으로 지정 할 수 있 습 니 다.
    #已经写好的command,存储在文件中
    wangsheng@ubuntu[20:49:12]:~/Documents$ cat command
    /java/,/android/p
    #使用-f选项指定command文件
    wangsheng@ubuntu[20:49:16]:~/Documents$ sed -n -f command hello
    hello java 2
    hello c++ 3
    hello android 4
    
  • - i: 읽 은 파일 내용 을 화면 에 출력 하 는 것 이 아니 라 직접 수정 합 니 다.이 옵션 을 사용 하면 원본 파일 의 내용 을 직접 바 꿀 수 있 습 니 다. 이 명령 으로 시스템 프로필 을 수정 하면 돌 이 킬 수 없 는 결과 가 발생 하면 자신 이 죽 었 다 고 탓 할 수 밖 에 없습니다.
    #源文件
    wangsheng@ubuntu[20:49:32]:~/Documents$ cat hello
    hello linux 1
    hello java 2
    hello c++ 3
    hello android 4
    hello php 5
    #第2行后添加新行,内容为this is a new line
    wangsheng@ubuntu[20:52:32]:~/Documents$ sed -i '2a this is a new line' hello
    #源文件被修改
    wangsheng@ubuntu[20:53:20]:~/Documents$ cat hello
    hello linux 1
    hello java 2
    this is a new line
    hello c++ 3
    hello android 4
    hello php 5
    

  • sed 실천 - 자동 채점 스 크 립 트
    지식 을 배 운 것 은 당연히 사용 하기 위 한 것 이다. 그러면 우 리 는 하나의 실제 예 로 sed 의 응용 을 보 자.
    선생님 은 서버 에서 우리 모 두 를 위해 student 를 만 드 셨 다.ids 파일, 안에 모든 학우 의 명단 이 있 고 모든 학우 들 은 이 문서 에서 다른 학우 들 에 게 점 수 를 매 겨 야 합 니 다.평 점 을 매 기 는 작업 을 완성 하기 위해 서 는 vi 를 사용 하여 편집 을 한 번 더 열 어야 합 니 다. 그리고 만점 을 받 거나 규칙 적 으로 점 수 를 매 길 수 없습니다. 그래서 게 으 름 을 피 울 수 있다 는 원칙 에 따라 자동 채점 스 크 립 트 를 쓸 수 있 습 니까?분명히 sed 처럼 강력 한 행 처리 기능 을 사용 하여 실현 하 는 것 은 틀림없이 문제 가 없 을 것 이다.
    마지막 으로 쓴 스 크 립 트 는 다음 과 같 습 니 다.
    #!/bin/bash
    count=0
    #统计行数
    while read line
    do
        count=$(($count+1))
    done < student_ids
    
    for (( i=1; i<="$count"; i++ ))
    do
        #产生84-99之间的随机数
        let score=$RANDOM%15+84
        #第i行行尾追加随机数
        sed -i "${i}s/$/ $score/g" student_ids
    done
    

    먼저 이 파일 의 줄 수 를 얻 고 변수 count 로 기록 합 니 다.그리고 count 회 를 순환 합 니 다. 매번 84 - 99 사이 의 무 작위 수 를 순환 합 니 다. sed 명령 을 사용 하여 이 무 작위 수 를 이 줄 의 줄 끝 에 삽입 한 다음 다음 다음 순환 을 통 해 다음 줄 에 똑 같은 동작 을 수행 합 니 다.주의해 야 할 것 은 여기 sed 는 - i 옵션 을 사용 하여 원본 파일 에 직접 이 동작 을 수행 하 는 것 을 표시 하고 강 한 인용 을 사용 합 니 다.약 한 인용 이 라면 $score 부분 을 하나의 문자열 로 간주 하고 줄 끝 에 $score 같은 문자열 을 추가 합 니 다.강 한 인용 을 사용 하면 $score 대표 하 는 무 작위 수 를 줄 끝 에 직접 삽입 합 니 다.
    마지막 효 과 는 다음 과 같다.
    #student_ids源文件
    wangsheng@ubuntu[21:03:12]:~/Documents$ cat student_ids
    142006010124
    142006010125
    142006010126
    142006010127
    142006010128
    142006010130
    142006010121
    142006010122
    #执行脚本
    wangsheng@ubuntu[21:03:27]:~/Documents$ sh autograding.sh
    8 lines completed!
    #student_ids文件已经被修改
    wangsheng@ubuntu[21:03:32]:~/Documents$ cat student_ids
    142006010124 98
    142006010125 90
    142006010126 94
    142006010127 89
    142006010128 96
    142006010130 84
    142006010121 94
    142006010122 98
    

    좋은 웹페이지 즐겨찾기