2013-03-15 2 views
0

여기 내 질문 :쉘 및 정규식 매칭 공간

는 예를 들어

echo 123\< abc\\\ efg 

출력은

123< abc\ efg 

렉스 파일 내 정규식

[^\n ]*[\\]+[^\n] 

인 할 필요가있는 경우 I 이 정규 표현식을 사용하면 출력물이 될 것입니다.

123< abc\ efg 

잘못된 것입니다. 누구나 \ (space)와 regular (space)를 어떻게 조화시킬 수 있습니까?

감사합니다.

+0

'echo 123 \ chepner

+0

123 \ Lamian

답변

0

정규 표현식이 정확합니다. 프롬프트

echo 123\< abc\\\ efg 

다음에 입력 할 때 발생합니다

  1. bashbash 입력 리디렉션 연산자로 <을 치료하는 것, 백 슬래시없이 (<\< 대체

  2. bash. \\을 단일 리터럴로 바꿉니다. \

  3. bash은 '\'를 하나의 리터럴 공간으로 바꿉니다.

  4. bash은 명령을 호출하여 인수 2 개 (123<abc\ efg)를 전달합니다.

  5. echo 출력은 123< abc\ efg이고, 두 개의 인수를 분리하는 단일 공백이있는 단일 문자열입니다.

정규 표현식을 바탕으로, 위의 5 단계에서 출력 한 문자열이 파일에 저장되어있는 것 같습니다. 이 13 바이트에서 유효한 유효 토큰은 123<, abc\efg입니다. 각 토큰을 공백으로 구분하여 단일 문자열로 표준 출력에 인쇄하면 123< abc\ efg이 표시됩니다. (백 슬래시 다음에 공백이 두 개 있어야하며 여러 공백을 표시 할 수 없습니다.)

+0

예. 렉서는 123 \ Lamian

1

나는 당신이 찾고있는 것이 플렉스 정규 표현식입니다. 따옴표 또는 다른 그런 합병증을 포함하십시오.

토큰을 자동으로 종료하는 문자는 ();<>&| 및 공백입니다. (bash 설명서에는 spacetab이 나와 있지만, 나는 또한 newline도 분리 된 단어라고 확신합니다.)

이러한 정규 표현식이 가능하지만 (인용 부호 : a$(echo foo)b은 하나의 단어 임) 따옴표를 사용하지 않기 때문에 부분적으로는 사용하기가 쉽지 않으며 부분적으로 결과 단어가 있어야하기 때문에 이스케이프 문자를 다시 검색합니다. 그러나 어쨌든. 단일 문자 뒤에 메타 문자 또는 이스케이프 문자, 또는

  • 이스케이프 문자 이외의

    • 아무것도 : 연속 인스턴스의 수와 일치

      ([^();<>&|\\[:space:]]|\\(.|\n))+ 
      

      : 다음은 샘플 플렉스 정규식입니다 또는

    • 이스케이프 문자와 그 뒤에 뉴 라인이옵니다.