Sed and awk 필기 sed 편: 실전

3880 단어
sed 편 은 모두 6 장 으로 나 뉜 다. (판) Sed & awk 노트 의 sed 편: Sed & awk 노트 의 sed 편 을 간단하게 소개 한다. 모드 공간 과 주소 가 일치 하 는 Sed & awk 노트 의 sed 편: sed 기본 명령 Sed & awk 노트 의 sed 편: 고급 명령 (1) Sed & awk 노트 의 sed 편: 고급 명령 (2) Sed & awk 노트 의 sed 편: 실전 에 서 는 grep 라 는 명령 을 사용 한 적 이 있 을 것 이 라 고 믿는다."the word" 를 포함 하 는 줄 을 보 는 등 정규 표현 식 과 일치 하 는 줄 을 찾 을 수 있 습 니 다.
$ grep "the word" filename

그러나 grep 는 한 줄 을 일치 시 키 기 때문에 짧 은 문장 이 두 줄 을 뛰 어 넘 으 면 일치 하지 않 습 니 다.이것 은 우리 에 게 하나의 문 제 를 주 었 습 니 다. 어떻게 sed 로 grep 의 행 위 를 모방 하고 크로스 줄 단문 의 매 칭 을 지원 합 니까?
단어 가 한 줄 에 만 나타 날 때 간단 합 니 다. 일반적인 정규 로 일치 할 수 있 습 니 다. 여기 서 우 리 는 분기 명령 을 사용 하고 일치 할 때 마지막 으로 이동 합 니 다.
/the word/b

단어 가 두 줄 을 넘 으 면 N 명령 으로 다음 줄 을 패턴 공간 으로 읽 고 처리 할 생각 이 듭 니 다.예 를 들 어 우 리 는 'the word' 라 는 짧 은 문장 을 찾 아야 합 니 다. 현재 텍스트 는 다음 과 같 습 니 다.
$ cat text
we want to find the phrase the
word, but it appears across two lines.

N 링 으로 다음 줄 을 읽 을 때 패턴 공간의 내용 은 다음 과 같다.
Pattern space: we want to find the phrase the
word, but it appears across two lines.

따라서 리 턴 기 호 를 삭제 하고 일치 시 켜 야 한다.
$!N
s/ *
/ / /the word/b

그러나 여기 서 문제 가 있 을 수 있 습 니 다. 만약 에 짧 은 문장 이 두 번 째 줄 을 읽 고 있다 면 일치 하지만 패턴 공간의 모든 내용 을 출력 합 니 다. 이렇게 하면 grep 의 행동 에 부합 되 지 않 고 짧 은 문장 을 포함 하 는 줄 만 표시 합 니 다.그래서 여기 서 하나의 처 리 를 추가 하여 패턴 공간의 첫 번 째 줄 내용 을 삭제 하고 두 번 째 줄 에서 일치 해 야 합 니 다.하지만 그 전에 패턴 공간의 내용 을 저장 해 야 한다. 그렇지 않 으 면 후회 할 약이 없다.
h 명령 은 모드 공간의 내용 을 유지 공간 에 저장 한 다음 에 교체 명령 을 이용 하여 모드 공간의 첫 줄 내용 을 제거 한 다음 에 일치 하 는 처 리 를 할 수 있 습 니 다.
$!N
h
s/.*
// /the word/b

일치 하지 않 으 면 짧 은 문장 은 두 줄 을 뛰 어 넘 을 수 있 습 니 다. 이 럴 때 우 리 는 먼저 g 명령 으로 이전에 저 장 된 내용 을 유지 공간 에서 패턴 공간 으로 되 돌려 주 고 차 를 교체 한 후에 일치 합 니 다.
g
s/ *
/ / /the word/b

일치 하면 마지막 으로 바로 이동 하고 출력 한 내용 은 교 체 된 내용 입 니 다.
그러나 우리 가 출력 하고 자 하 는 것 은 일치 하 는 원문 입 니 다. 원문 은 현재 공간 을 유지 하고 복사 본 이 있 기 때문에 일치 할 때 원문 을 유지 공간 에서 되 찾 아야 합 니 다.
g
s/ *
/ / /the word/{ g b }

마찬가지 로 우 리 는 일치 하지 않 는 상황 을 고려 해 야 한다. 일치 하지 않 을 때 도 원문 을 유지 공간 에서 되 찾 고 패턴 공간의 첫 줄 을 삭제 하 며 다음 줄 을 계속 처리 해 야 한다.
g
s/ *
/ / /the word/{ g b } g D

모든 sed 스 크 립 트 를 합 쳐 다음 내용 을 phrase. sed 파일 에 저장 할 것 이 라 고 가정 합 니 다.
/the word/b
$!N
h
s/.*
// /the word/b g s/ *
// /the word/{ g b } g D

다음은 위 스 크 립 트 가 정확 한 지 텍스트 로 테스트 합 니 다.
$ cat text
We will use phrase.sed to print any line which contains
the word. Or if the word appears across two lines, like
below:

It will print this line, because the
word appears across two lines.

You can run sed -f phrase.sed text to test this.

실행 명령 은 다음 과 같다.
$ sed -f phrase.sed text
the word. Or if the word appears across two lines, like
It will print this line, because the
word appears across two lines.

위의 명령 중의 "the word" 는 사실 하나의 변수 일 수 있 습 니 다. 그러면 우 리 는 이 기능 을 스 크 립 트 나 함수 로 작성 하여 더 많은 곳 에 사용 할 수 있 습 니 다.
$ cat phrase.sh 
#! /bin/sh
# phrase -- search for words across lines
# $1 = search string; remaining args = filenames

search=$1

for file in ${@:2}; do
    sed "/$search/b
    \$!N
    h
    s/.*
// /$search/b g s/ *
/ / /$search/{ g b } g D" $file done $ chmod +x phrase.sh $ ./phrase.sh 'the word' text the word. Or if the word appears across two lines, like It will print this line, because the word appears across two lines.

이것 은 시작 일 뿐 이거 나, 너 도 이 기초 위 에서 더 많은 기능 을 확장 할 수 있다.sed 의 명령 은 한 가지 로 볼 때 복잡 하 지 는 않 지만 잘 쓰 려 면 좀 어렵 기 때문에 많이 실천 하고 많이 생각해 야 합 니 다. 이 점 은 정규 표현 식 의 학습 과 같 습 니 다.기 존의 학습 환경 이 없다 고 생각한다 면, sed1line 은 좋 은 시작 이다.연대 의 작은 둥지, 본문 고정 링크: Sed and awk 노트 의 sed 편: 실전

좋은 웹페이지 즐겨찾기