>

이 정규 표현식이 있습니다 :

(?<=prefix).*$

문자열 "접두사"다음에 오는 문자를 반환하며 온라인 정규식 엔진 (예 : https://regex101.com ). 문제는 내가 bash에서 정규식을 사용할 때입니다 :

grep '(?<=prefix).*$' <<< prefixSTRING

아무 것과도 일치하지 않습니다. 그 정규식이 grep과 작동하지 않는 이유는 무엇입니까?

  • 답변 # 1

    올바른 정규 표현식을 정의한 것 같지만 grep 에 대한 명령 행에 충분한 플래그를 설정하지 않았습니다  그것을 이해합니다. 기본적으로 grep  BRE 및 -E 지원  ERE를 표시합니다. 가지고있는 것 (look-aheads)은 GNU grep 에서만 지원되는 PCRE 정규 표현식에서만 사용할 수 있습니다.  그것의 -P 와 함께  깃발.

    prefix 이후에 일치하는 문자열을추출해야한다고 가정  여분의 깃발 -o 를 추가해야합니다   grep 를 알리기 위해  일치하는 부분을인쇄

    grep -oP '(?<=prefix).*$' <<< prefixSTRING
    
    

    grep 버전도 있습니다  기본적으로 PCRE 라이브러리를 지원하는- pcregrep  할 수있는 것

    pcregrep -o '(?<=prefix).*$' <<< prefixSTRING
    
    

    다양한 정규식 풍미에 대한 자세한 설명은이 훌륭한 Giles의 답변과 이들 각각을 구현하는 도구에 설명되어 있습니다

  • 답변 # 2

    정규적인 표현은 여러 가지 풍미가 있습니다. 표시하는 것은 Perl과 같은 정규 표현식 (PCRE, "Perl 호환 정규 표현식")입니다.

    grep  POSIX 정규식을 수행합니다. 기본 정규 표현식 (BRE) 및 확장 정규 표현식 (ERE, grep 인 경우)   -E 와 함께 사용  선택권). re_format 설명서를 참조하십시오  또는 regex  또는 당신의 grep 와 유사한 설명서  manual은 시스템 또는 방금 링크 한 POSIX 표준 텍스트를 나타냅니다.

    GNU grep 를 사용하는 경우 grep 를 사용하면 Perl과 같은 정규 표현식을 사용할 수 있습니다.  GNU grep 와 함께 특정 -P  옵션.

    또한 grep  줄의 하위 문자열이 아닌 기본적으로을 반환합니다. GNU grep 와 함께  (그리고 다른 grep  구현), 당신은 -o 를 사용할 수 있습니다  각 줄에서 주어진 표현식과 일치하는 비트 만 가져옵니다.

    -P 참고  그리고 -o   grep 의 POSIX 사양이 아닌 비표준 확장입니다. .

    GNU grep 를 사용하지 않는 경우 , 당신은 sed 를 사용할 수 있습니다  대신 문자열 prefix 사이의 비트를 얻으려면  그리고 줄의 끝 :

    sed -n 's/.*prefix\(.*\)/\1/p' file
    
    

    이것은 sed 줄만 인쇄하는 것입니다  주어진 대체물을 적용합니다. 대체는 표현식 (BRE)과 일치하는 전체 행을 문자열 prefix 다음에 발생하는 부분으로 대체합니다. .

    prefix 의 인스턴스가 여러 개인 경우  줄에, sed  변형은last문자열 뒤의 문자열을 반환하지만 GNU grep  변형은처음후의 문자열을 반환합니다 ( prefix 의 다른 인스턴스를 포함 함) ).

    와이즈 비즈  해결책은 모든 유닉스 계열 시스템에 이식 가능합니다.

  • 답변 # 3

    다른 답변에서 언급했듯이 sed  lookbehinds와 함께 정규 표현식을 사용하지 않습니다 (기본적으로 GNU grep 와 함께) , 또는 다른 버전에서는 아님)

    GNU grep 를 사용할 수 없다면  또는 grep pcregrep 를 사용할 수 있습니다  당신이 그것을 가지고 있다면.

    perl 와 동등한 명령 행  다음과 같습니다.

    perl
    
    
    슬래시 사이에 원하는 정규 표현식을 넣습니다. Perl을 사용함에 따라 Perl의 정규 표현식을 사용합니다.

    perl -ne 'print if /(?<=prefix).*$/' <<< prefixSTRING

  • 이전 systemd journald - / var/log/journal/upload에서 오는/var/log/journal/remote에서 저널 파일 이름 변경
  • 다음 bash의 awk를 사용하여"if"절에서 여러 명령문을 실행하는 방법은 무엇입니까?