다음을 수행해야 합니다.
"hi"와 "hello" 패턴 사이에 텍스트를 인쇄합니다.
패턴이 반복될 수도 있고 여러 번 나타날 수도 있습니다 hi
.hello
소스 파일:
hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff
예상 출력.
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello
awk
and 명령을 사용해 보았지만 sed -n
첫 번째 항목과 마지막 항목 사이의 모든 줄이 표시됩니다.hi
hello
답변1
~에서첫 번째안녕하세요첫 번째안녕하세요 다음입니다.
grep
(GNU) grep 및 tr 사용:
$ <infile grep -oPz "(?s)hi.*?hello" | tr '\0' '\n'
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello
설명하다:
<infile
소스 파일.grep -oPz
부르다grep
:- (
-P
)는 다음과 일치합니다.인상업용 부동산(Perl 호환 정규식) - (
-o
)오일치하는 부분만 인쇄됩니다. - (
-z
)를 사용하다지ero 바이트(일명 NUL 및 일명\0
)를 줄 구분 기호로 사용합니다.
- (
"(?s)
PCRE 점(.
)도 개행 문자와 일치하도록 만듭니다.hi
문자열로 시작하십시오hi
..*?
다음 문자와 모두 일치합니다( 이기 때문에 탐욕스럽지 않음?
).hello"
문자열이hello
일치할 때까지.| tr '\0' '\n'
NUL(\0
) 바이트를grep -z
개행 문자로 변환합니다.
sed
GNU sed:
<infile sed 's/hi/\n&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'
\n
또는 오른쪽을 허용하지 않는 BSD sed의 경우 변수를 s///
정의해야 합니다 .newline
nl
$ eval "$(printf "nl='\n'")"
그런 다음:
<infile sed 's/hi/\'"$nl"'&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'
또는 명시적인 개행 문자를 작성할 수 있는 경우:
<infile sed 's/hi/\
&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'
답변2
grep -oPz "(?s)hi.*?hello" fileName
설명은 다음과 같습니다.
고양이 TMP
출력->
hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff
00000000000
hi ff
djd h
sdkf hello
dfj
해결책:
grep -oPz "(?s)hi.*?hello" tmp
출력->
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello
hi ff
djd h
sdkf hello
매개변수:
-z
이 옵션은 grep에게 개행 문자를 일반 텍스트 문자로 처리하고 레코드를 구분하기 위해 널 바이트를 찾도록 지시합니다. 널 바이트가 없는 텍스트 파일에서는grep -z
전체 파일이 한 줄로 처리됩니다.(?s)
'.'을 의미하는 PCRE_DOTALL을 활성화하면 문자나 개행 문자를 찾습니다.o
일치하는 부분만 인쇄-P
패턴을 Perl 호환 정규식(PCRE)으로 해석합니다. 이는 특히 -z(--null-data) 옵션과 결합할 때 매우 실험적이며 "grep -P"는 구현되지 않은 기능에 대해 경고할 수 있습니다..*?
욕심없는 매칭을 위해.hi
첫 번째 인스턴스를 찾으면 다음 일치 항목 검색을 시작하세요.hello
답변3
앗 낄낄거려
#!/usr/bin/awk -f
{
n=split($0, col, FS)
for(i=1;i<=n;i++){
(i==n)? sp="" : sp=FS
if (col[i] ~ /hi/) p=1
if (p == 1 && col[i] ~ /hello/) h=1
if (p == 1) printf("%s%s",col[i],sp)
if (h==1) p=0;h=0
}
printf "\n"
}
kapu@jake:$ cat SourceFile
hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff
kapu@jake:$ script.awk SourceFile
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello