"abc" 및 "def"로 시작하는 문자열의 일부를 인쇄하려고 합니다. 예:
123456789
123abc_fff_def456789
123456789
...
결과:
abc_fff_def
답변1
비표준 옵션을 grep
지원 -o
하는 경우 :-P
grep -Po 'abc.*?def' < your-file
abc
와 def
같은 줄에 있다고 가정합니다 . 행당 여러 이벤트를 보고할 수 있습니다.
.*?
0개 이상의 문자로 구성된 시퀀스와 일치합니다.가능한 적게, 이는 .*
일치합니다많을수록 좋다. 이는 입력에 영향을 미칩니다. 예를 들어, 0abc1def2def3
with .*?
, you get abc1def
while with .*
, you get abc1def2def
(그리고 on 0abc1def2abc3def4
, you get abc1def
and abc3def
vs abc1def2abc3def
).
0abc1abc2def3
그럼에도 불구 하고 다음과 같은 입력 abc1abc2def
에서일찍가능한 한 많이.
여러 줄의 데이터를 일치시키려면 다음을 사용할 수 있습니다 perl
( P
in은 grep -P
실제로 Perl과 같은 정규 표현식에 사용됩니다).
perl -l -0777 -ne 'print for /abc.*?def/gs' < your-file
답변2
grep
와 사이에 잠재적인 문자를 허용하는 매우 간단한 정규식을 사용하십시오 .abc
def
grep -o 'abc.*def' input
답변3
주문하다
sed "s/[^a-z].[^a-z]//g" file
grep -o "[a-z].*[a-z]" file
산출
abc_fff_def
답변4
Gnu sed /def/를 볼 때 플래그를 접두어로 사용하고 /abc/를 볼 때 플래그를 접미어로 사용합니다. 그런 다음 패턴 공간의 시작 부분까지 /abc/ 버블이 나타날 때까지 미친 듯이 계속 자릅니다.
$ sed -ne '
/\n/{/^abc.*def\n/P;D;}
s/def/&\n/;s/abc/\n&/
/\n.*\n/D
' file
Perl을 사용하여 패턴 존재 여부에 따라 ORS => $\에 적절한 값을 할당합니다. 한 쌍만 인쇄됨
perl -lpe '
$\ = /(abc.*?def)/ ? $/ : $,;
$_=$1;
' file