링크 ux 명령 학습 (2) -- sed
뭐 공부 해요?
sed 는 stream editor 의 줄 임 말 입 니 다. 번역 하면 '스 트림 편집기' 이 고 실제 적 으로 그 역할 도 설명 한 것 과 같 습 니 다.sed 명령 은 행 처 리 를 위 한 도구 로 행위 처리 단위 로 강력 한 처리 능력 을 실현 할 수 있 습 니 다.sed 는 모든 줄 을 처리 한 후에 표준 출력 으로 출력 합 니 다. 우리 가 볼 수 있 는 각도 에서 sed 는 수 정 된 내용 을 셸 에 출력 하고 원본 파일 을 수정 하지 않 습 니 다 (물론 원본 파일 을 수정 하려 면 가능 합 니 다).
수학 을 공부 하 는 것 처럼 sed 의 용법 은 하나의 공식 으로 요약 할 수 있다.
sed [选项] 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 명령 이 어느 줄 이나 몇 줄 을 조작 해 야 하 는 지 입 니 다.주의해 야 할 것 은 줄 을 선택 하지 않 으 면 모든 줄 에 이 동작 을 기본적으로 실행 합 니 다.자주 사용 하 는 범위 설정 은 다음 과 같은 몇 가지 형식 이 있 습 니 다.
#显示第2行
wangsheng@ubuntu[18:49:47]:~/Documents$ sed -n '2p' hello
hello linux 2
#显示2-4行
wangsheng@ubuntu[19:40:50]:~/Documents$ sed -n '2,4p' hello
hello linux 2
hello linux 3
hello linux 4
#显示第4行到最后一行
wangsheng@ubuntu[19:44:41]:~/Documents$ sed -n '4,$p' hello
hello linux 4
hello linux 5
#显示除了第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
는 정규 표현 식 을 사용 할 수 있 습 니 다.#查询显示含有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
동작 처리
동작 처 리 는 우리 가 선택 할 수 있 도록 다양한 동작 을 제공 할 것 이 며, 이러한 동작 을 이용 하여 특정한 줄 의 내용 을 추가, 삭제, 수정 등 작업 을 할 수 있다.여기 서 자주 사용 하 는 동작 몇 가 지 를 소개 합 니 다.
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
줄 바 꿈 자 를 사용 할 수 있 습 니 다.#在文件末添加一行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
#第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
#删除第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
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 가 유용 합 니 다. 그렇지 않 으 면 줄 마다 첫 번 째 만 바 꾸 고 더 이상 찾 지 않 습 니 다.
#需要插入的文件内容
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选项,只会输出处理的那一行
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
#前一个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
#已经写好的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
#源文件
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.