특정 줄을 읽고 "abc"로 시작하고 "def"로 끝나는 문자열 부분을 추출하려면 어떻게 해야 합니까?

특정 줄을 읽고 "abc"로 시작하고 "def"로 끝나는 문자열 부분을 추출하려면 어떻게 해야 합니까?

"abc" 및 "def"로 시작하는 문자열의 일부를 인쇄하려고 합니다. 예:

123456789
123abc_fff_def456789
123456789
...

결과:

abc_fff_def

답변1

비표준 옵션을 grep지원 -o하는 경우 :-P

grep -Po 'abc.*?def' < your-file

abcdef같은 줄에 있다고 가정합니다 . 행당 여러 이벤트를 보고할 수 있습니다.

.*?0개 이상의 문자로 구성된 시퀀스와 일치합니다.가능한 적게, 이는 .*일치합니다많을수록 좋다. 이는 입력에 영향을 미칩니다. 예를 들어, 0abc1def2def3with .*?, you get abc1defwhile with .*, you get abc1def2def(그리고 on 0abc1def2abc3def4, you get abc1defand abc3defvs abc1def2abc3def).

0abc1abc2def3그럼에도 불구 하고 다음과 같은 입력 abc1abc2def에서일찍가능한 한 많이.

여러 줄의 데이터를 일치시키려면 다음을 사용할 수 있습니다 perl( Pin은 grep -P실제로 Perl과 같은 정규 표현식에 사용됩니다).

perl -l -0777 -ne 'print for /abc.*?def/gs' < your-file

답변2

grep와 사이에 잠재적인 문자를 허용하는 매우 간단한 정규식을 사용하십시오 .abcdef

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

관련 정보