2016-07-16 5 views
1

배열 -> n 마카 (배열 -> 단어, 단어 -> 단어 단어 -> n A (Word -> Chars, Char -> Char Chars, Char -> 'n ', Chars -> Char, Char ->'A '), 단어 -> 단어 단어 -> ma (Word -> Chars, Chars -> Char Char, Char ->'m ', Chars -> Char, Char -> 'a'), 단어 - 단어, 단어 -> 카 (Word -> Chars, Chars -> Char Char, Char -> 'k', Char -> Char, Char -> 'a'))파일의 패턴 일치

나는 이와 같이 1000 줄의 파일이 있습니다. 나는이 같은 패턴을 검색 할 그 어떤 경우에 알파벳의 수를 포함 할 수 있습니다 그 후 - - "> 단어"

  • , 즉 "말씀 (> N A"
      가 시작해야
    1. > N A (
    2. ,691 -
    3. 는 "("개방 브래킷

    I 원하는 라인 위에서 예

    1. 단어를 종료
    2. 워드 -> 엄마 (
    3. 워드 -> 카 (I이 grep 명령 시도

    : 노 GREP. "말씀 ->를 * ("파일 이름

    그러나, 그것은 같은 반환 이 :

    Word -> n A (Word -> Chars, Char -> Char Chars, Char -> 'n', Chars -> Char, Char -> 'A'), 단어 -> 단어 , 단어 -> ma (단어 -> 문자 -> 문자 -> 문자 문자 -> 문자 -> 문자 -> 문자 -> 문자), 단어 - 단어, 단어 -> 카 (

    또한 모든 일치하는 패턴을 출력 파일의 한 줄에 입력하고 싶습니다.

    다른 방법으로도 수행 할 수 있는지 제안하십시오.

  • 답변

    0
    $ grep -no 'Word -> [[:alpha:] ]\+(' file 
    1:Word -> n A (
    1:Word -> m a (
    1:Word -> k a (
    

    위의 내용은 정규식이 일치하는 원본 파일의 줄 번호를 보여줍니다. 경우, 대신, 당신은 경기 후 순차적으로 번호가 원하는 :

    $ grep -o 'Word -> [[:alpha:] ]\+(' file | cat -n 
        1 Word -> n A (
        2 Word -> m a (
        3 Word -> k a (
    

    는 원래 코드는 .*을 사용했다. 두 가지 문제가 있습니다. 하나는 .(을 (를) 포함한 모든 항목과 일치한다는 것입니다. 두 번째는 정규식이 욕심이 많다는 것입니다. 가장 긴 일치하는 문자열과 일치합니다.

    여기에서 .* 대신에 [[:alpha:] ]\+을 사용했습니다. 이것은 하나 이상의 문자와 공백과 일치합니다. 문자와 공백 만 일치하기 때문에 (과 일치하지 않으므로 원하는 길이가 일치합니다.

    편지와 일치시키기 위해 [:alpha:]을 사용하고 있습니다. [a-zA-Z]과 같은 이전 양식과 달리 [:alpha:]은 유니 코드로 안전합니다.

    .*을 사용할 때의 문제점은 가능한 한 가장 길게 일치하는 욕심입니다. 너는 가장 짧은 성냥을 원한다.

    +1

    감사합니다. –