CK
D
줄 끝의 줄에서 grep을 시작하고 줄 끝의 줄에서 grep을 중지하고 싶습니다 . 나는 그것을 시도했지만 grep "$CK" "$D" file..txt
성공하지 못했습니다.
입력하다:
kkkkkkkkkkk
jjjjjjjjjjjjjjjjjj
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
GGGGGGGGGGGGGG
GGGGGGGGGGGGGG
원하는 출력:
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
답변1
awk '/CK$/,/D$/' file.txt
또는
sed -n '/CK$/,/D$/p' file.txt
당신이 주장하는 경우grep, 이는 GNU grep 방식입니다.
grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt
여기
-P
Perl-regexp 활성화
-z
줄 구분 기호를 NUL로 설정합니다. 이렇게 하면 grep이 전체 파일을 한 줄로 처리하게 됩니다.
-o
일치하는 것만 인쇄
(?s)
.
모든 문자나 개행 문자를 찾을 수 있도록 PCRE_DOTALL을 활성화하세요.
\N
줄 바꿈을 제외한 모든 항목과 일치합니다.
.*?
비 욕심 모드에서.
(?<=..)
역방향 주장이다
(?=..)
예견 주장이다
답변2
BSD를 사용하는 경우 grep
(perl regex 매개변수는 지원되지 않음 -P
) 해결 방법은 다음과 같습니다.
grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'
_
이는 모든 줄을 연결하고(새 줄을 문자로 대체 ) 단일 줄 모드를 확인한 다음 줄을 다시 원래 상태로 확장하여 수행됩니다 .
GNU를 사용하는 경우 grep
에서 여러 줄 일치를 달성할 수 있지만 다른 항목에서 언급한 것처럼 ( ) grep
에 대해 perl-regexp를 사용해야 합니다.grep
-P
답변. 여전히 grep
macOS에 GNU를 설치 brew install grep
하고 사용할 수 있습니다 ggrep
.
아니면 당신은 사용할 수 있습니다pcregrep
다중 라인 모드( -M
)를 지원합니다.
ex
다음과 같은 명령을 사용할 수도 있습니다 .
ex +"/aaa/;/cdn/p" -scq! file
답변3
`awk '/CK$/{f=1}/D$/{f=0;print;exit}f' filename
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
답변4
Perl(5) 사용:
perl -nE 'print $_ if /CK$/.../D$/;'
Raku(이전 Perl_6) 사용:
raku -ne 'put $_ if /CK$/fff/D$/;'
위의 두 코드 줄 모두 sed와 유사한 "트리거" 연산자를 사용합니다. Perl5에서는 sed와 유사한 "trigger"의 철자가 입니다 ...
. Raku에서 "trigger"는 sed 와 같습니다 fff
.
입력 예:
kkkkkkkkkkk
jjjjjjjjjjjjjjjjjj
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
GGGGGGGGGGGGGG
GGGGGGGGGGGGGG
출력 예(Perl5 또는 Raku):
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
Raku는 .
점을 사용하여 연산을 연결하므로 ...로 시작하는 Raku 코드는 ... put $_
로 작성할 수 있습니다 $_.put
. 또한 메소드 체인이 .
점으로 시작하는 경우 Raku는 기본적으로 $_
테마 변수에서 체인을 호출합니다. 따라서 위에 주어진 Raku 코드는 $_.put
... 로 단축되거나 더 단축 될 수 있습니다 .put
... .