Unix 쉘 스크립트의 파일에서 특정 문자열 패턴 찾기

Unix 쉘 스크립트의 파일에서 특정 문자열 패턴 찾기

다음 명령이 있습니다.

 unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | grep  ":taxonomies-" | head -1

이것은 나에게 출력을 제공합니다.

    <j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>

하지만 추출만 하면 됩니다.분류-8.2.0위의 전체 문자열 대신.

답변1

-o한 가지 방법은 grep의 옵션을 다음과 결합하여 사용하는 것입니다.PCRE( -P):

   -o, --only-matching
          Print  only  the  matched  (non-empty) parts of a matching line,
          with each such part on a separate output line.
   -P, --perl-regexp
          Interpret  PATTERN  as  a  Perl  regular  expression  (PCRE, see
          below).  This is highly experimental and grep  -P  may  warn  of
          unimplemented features.

그래서, 당신은 이것을 할 수 있습니다

 unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | grep -oP ':\Ktaxonomies-[^"]*' | head -1

\K해당 지점까지 일치하는 모든 항목이 무시되고(따라서 :인쇄되지 않음) " [^"]*"문자가 아닌 문자를 최대한 많이 일치" 함 을 의미합니다."

기타 옵션은 다음과 같습니다.

  1. sed

    unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | 
        sed -n 's/.*:\(taxonomies-[^"]*\).*/\1/p' | head -1
    

    명시적으로 지시하지 않는 한 아무 것도 인쇄되지 않으며 -n대체 연산자입니다. 줄의 모든 내용을 괄호( ) 사이의 부분으로 대체합니다. 이로 인해 결과 줄이 인쇄됩니다.seds///\1p

  2. unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | 
      perl -lne 's/.*:(taxonomies-[^"]).*/$1/ && print' | head -1
    

    와 같은 기본 아이디어입니다 sed. 교체가 성공하면 라인을 인쇄합니다. 또 다른 옵션은

    unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | 
      perl -lne '/.*:(taxonomies-[^"])/ && print $1' | head -1
    

답변2

무슨 일이 일어났는지 안다면:입력의 문자에 대해 유사한 작업을 수행할 수 있습니다.

echo " <j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>" | 
awk -F\: '{print $4}' | sed 's/..$//'

이 명령은 awk다음 네 번째 문자열을 인쇄합니다.:구분 기호인 경우 이 sed명령은 원하는 출력을 얻기 위해 마지막 2자를 제거하는 데 사용됩니다.

그러나 이 방법의 작동 여부는 입력 내용에 따라 다릅니다.Tedden이 댓글에서 지적했습니다..

편집하다

sed제안된 솔루션을 사용하면 최종 파이프라인을 피할 수 있습니다.제이슨 라이언 존재하다논평. 따라서 명령은 실제로 다음과 같이 다시 작성할 수 있습니다.

 echo " <j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>" | 
 awk -F: '{sub(/\/>/,""); print $4}'

cut과 rev만을 사용하는 또 다른 솔루션은 다음과 같이 구성될 수 있습니다.

echo " <j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>" | 
cut -d ':' -f4 | rev | cut -c 3- | rev

다시 말하지만, 구분 기호의 사양은 입력 파일에 따라 다르며 제공한 예에서 추출해야 하는 문자는 구분 기호 의 네 번째 위치 뒤에 나타납니다 . 나는 네 번째 구분 기호 뒤의 하위 문자열을 추출 cut하고 좋은 오래된 기술을 사용하여 문자열을 반전하고 마지막 3자를 제거한 다음 다시 적용하여 실제 문자열을 얻었습니다.revrev

관련 정보