Sed and awk 필기 sed 편: 실전
$ 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 편: 실전
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.