2011-01-17 3 views
1

필자는 출력 파일에 출력 파일을 제공하는 Voice-to-Text 응용 프로그램을 사용하고 있습니다. 필사본 텍스트는 (s) (문장 시작 부분)과 같은 몇 개의 태그를 포함합니다 .. 끝) .. (VOCAL_NOISE) (인식 할 수없는 단어) ..하지만 텍스트도 (VOCAL_N), (VOCAL_NOISED), (VOCAL_SOUND), (UNKNOWN) 같은 원하지 않는 태그가 포함되어 있습니다 .. 나는 텍스트를 처리하기 위해 SED를 사용하고 있습니다 ..하지만 대체 할 수있는 적절한 정규 표현식을 쓸 수 없습니다 (s), (/s)(VOCAL_NOISE) 태그를 제외한 다른 태그는 ~NS입니다. 누군가가 도와 주시면 감사하겠습니다.Regex Negation : 특정 문자열 이외의 패턴 일치

예제 텍스트 :

(s) Hi Stacey , this is Stanley (/s) (s) I would (VOCAL_N) appreciate if you could call (UNKNOWN) and let him know I want an appointment (VOCAL_NOISE) with him (/s) 

출력해야한다 : 당신은 다음과 같은 작업을 수행 할 수 쉘 (bash는) 사용

:%s/\((\w\+)\)\&\(\((s)\|(VOCAL_NOISE)\)\@!\)/\~NS/g 

:

(s) Hi Stacey , this is Stanley (/s) (s) I would ~NS appreciate if you could call ~NS and let him know I want an appointment (VOCAL_NOISE) with him (/s) 

답변

1

이 알아서해야합니다

sed 's|([^)]*)|\n&\n|g;[email protected]\n\((/\?s)\|(VOCAL_NOISE)\)\[email protected]\[email protected];s|\n\(([^)]*)\)\n|~NS|g' inputfile 

설명 :

  • s|([^)]*)|\n&\n|g - 두 줄 바꿈
  • [email protected]\n\((/\?s)\|(VOCAL_NOISE)\)\[email protected]\[email protected]
  • 사이의 모든 괄호 문자열을 넣어 라인을 분할 - 주위의 줄 바꿈을 제거 "(s) ","(/ s) "및
    "(VOCAL_NOISE) "(보관 인)
  • s|\n\(([^)]*)\)\n|~NS|g - 괄호 안에있는 개행 문자 사이를 "~ NS"로 바꿉니다.

새 행이 새로 읽은 텍스트 줄에 나타나지 않으므로이 기능이 작동합니다.

편집 :는 교대 \(foo\|bar\)를 사용하여 명령을 단축

이전 버전 :

sed 's|([^)]*)|\n&\n|g;s|\n\((/\?s)\)\n|\1|g; s|\n\((VOCAL_NOISE)\)\n|\1|g;s|\n\(([^)]*)\)\n|~NS|g' inputfile 
DarkDust @

0

내가이 사용하여 정력을 제안 할 수

vim file -c '%s/\((\w\+)\)\&\(\((s)\|(VOCAL_NOISE)\)\@!\)/\~NS/g' -c "wq" 

백업을 먼저 작성하십시오. 잘못되었을 경우 책임지지 않습니다.

0

간단히 말해서?

sed -E 's/\((VOCAL_N|UNKNOWN)\)/~NS/' 

이 경우 필터링 할 항목이 무엇인지 알 것입니다. 또는 화이트리스트를 절대적으로 필요로합니까 (필터링하지 않을 항목을 알고 있습니까)?

+0

: 것은 내가 예측할 수 없다 ..입니다 원치 않는 것 태그가 발생합니다 .. 나는 오직 원하는 태그 viz (s)의 확실한 오전, (/ s)와 (VOCAL_NOISE) .. 소위 화이트리스트 .. 그래서, ~ NS로 원치 않는 태그를 대체하면서 원하는 태그를 유지해야합니다. –

0
awk -vRS=")" -vFS="(" '$2!~/s|\\s|VOCAL_NOISE/{$2="~NS"}RT' ORS=")" file |sed 's/~NS)/~NS/g' 
1

이 더러운 것을 멀리 떨어져 트릭 최적이지만 당신을 위해 일한다이다 :

sed ' 
    s|(\(/\?\)s)|[\1AAA]|g; 
    s|(VOCAL_NOISE)|[BBB]|g; 

    s/([^)]*)/~NS/g; 

    s|\[\(/\?\)AAA\]|(\1s)|g; 
    s|\[BBB\]|(VOCAL_NOISE)|g' 

트릭은 (들)을 대체하는 것입니다 (/ 초) 및 (VOCAL_NOISE)와 입력 텍스트 (이 경우 [AAA], [/ AAA] 및 [BBB])에 존재하지 않는 패턴; (. *)의 모든 인스턴스를 ~ NS로 바꿉니다. 결국 가짜 패턴을 원래 값으로 되돌립니다.