Отрицание регулярных выражений: сопоставление шаблонов, отличных от конкретных строк - PullRequest
1 голос
/ 17 января 2011

Я использую приложение Voice-to-Text, которое выдает файлы транскрипции в качестве вывода .. Транскрибированный текст содержит несколько тегов, таких как (s) (для начала предложения) .. (/s) (для конца предложения) .. (VOCAL_NOISE) (для нераспознанных слов) .. но текст также содержит нежелательные теги, такие как (VOCAL_N), (VOCAL_NOISED), (VOCAL_SOUND), (UNKNOWN) .. Я использую SED для обработки текста .. но не могу написать соответствующее регулярное выражение для замены всех других тегов, кроме (s), (/s) и (VOCAL_NOISE), на тег ~NS .. будет признателен, если кто-нибудь сможет мне помочь с этим ..

Пример текста:

(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)

Вывод должен быть:

(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)

Ответы [ 5 ]

1 голос
/ 17 января 2011

Это должно позаботиться об этом:

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

Объяснение:

  • s|([^)]*)|\n&\n|g - разделить строку, поместив каждую строку в скобках между двумя новыми строками
  • s@\n\((/\?s)\|(VOCAL_NOISE)\)\n@\1@g - удалить символы новой строки вокруг "(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

1 голос
/ 17 января 2011

Это грязная уловка, которая далека от оптимальной, но она должна работать для вас:

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

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

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

Хитрость заключается в замене (s), (/ s) и (VOCAL_NOISE) шаблонами, которыеотсутствуют во входном тексте (в этом случае [AAA], [/ AAA] и [BBB]);затем мы заменяем каждый экземпляр (. *) на ~ NS;в конце мы возвращаем имитацию паттернов к их первоначальному значению.

0 голосов
/ 17 января 2011

Просто это?

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

В этом случае у вас будет черный список (вы знаете, что отфильтровывать). Или вам абсолютно нужен белый список (вы знаете, что НЕ нужно отфильтровывать)?

0 голосов
/ 17 января 2011
awk -vRS=")" -vFS="(" '$2!~/s|\\s|VOCAL_NOISE/{$2="~NS"}RT' ORS=")"  file |sed 's/~NS)/~NS/g'
0 голосов
/ 17 января 2011

Я мог бы предложить это с помощью vim:

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

Используя оболочку (bash), вы можете сделать следующее:

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

Сначала создайте резервную копию, я не несу ответственности залюбой ущерб, если это не так.

...