Как заменить совпадения символов конечными символами из одной текстовой строки? - PullRequest
1 голос
/ 28 сентября 2010

Я использую pdftotext для преобразования текста на испанском языке.Символы с акцентами или тильдами выводятся систематическим образом, что требует дальнейшего преобразования.Акценты и тильды отображаются в преобразованном тексте в правильном положении, но без буквы.Буква почти всегда появляется в конце строки вывода.Когда это не так, я могу починить их вручную.

Например, pdf-предложение

¿Por qué?

становится

¿Por qu´? e

Я достаточно знаю о sed, awk и grep, чтобы думать, что это можно сделать с помощью некоторой комбинациите - и что это займет у меня много времени.Я намерен использовать это для обработки всех файлов PDF в папке.

Предложения отображаются в испано-английских парах в отдельных строках.Я хотел бы объединить их с помощью точки с запятой, формат импорта моего приложения флэш-карты (Anki).Удалите все содержимое, не являющееся парами предложений испано-английского языка.

Например, преобразуйте этот вывод

B:

¿Por qu´? e
Why?

в

¿Por qué?;Why?

, где есть несколько акцентов,тильды или их комбинация, буквы в конце строки расположены в правильном порядке и могут быть разделены запятыми.Например, предложение в формате pdf

Sí pero vi en la televisión que iba a llover.

становится

S´ pero vi en la televisi´n que iba a llover. ı, o

, или S'pero vi en la televisi´n que iba llover.ı o

Формат выходного файла

Предложения всегда имеют пунктуацию, либо "!", "?"или же ".".Для незнакомых с испанским языком гласные (aeiou) являются единственными буквами, которые могут иметь ударение, буква «n» - единственная, которая может иметь тильду, и 2 специальных символа могут быть найдены как в верхнем, так и в нижнем регистре букв.

Первая строка вывода может содержать уровень и заголовок файла PDF.Уровень и заголовок всегда предшествуют первому вхождению «A:»

Меня не интересует строка «Словарь слов» или что-либо, что появляется в любых последующих строках.

pdftotext run withКодировка UTF8.Моя ОС - Linux Mint 9, которая основана на Ubuntu 10.04

Ниже приведены два примера выходных файлов.

Выход 1

Elementary - Credit Card A:

(B0089)

Me da la cuenta, por favor.
Bring me the check, please.

B:

Se la doy enseguida.
I’ll bring it to you right away.

B:

Perd´n se˜or, pero no aceptamos tarjeta. o n
Sorry sir, but we don’t take cards.

A:

¿No aceptan ninguna tarjeta de cr´dito? e
You don’t take any credit cards?


Key Vocabulary

tarjeta cr´dito e cuenta

Noun Noun Noun

card credit bill

Выход 2

Elementary - My computer is not working A: ¡No puede ser!
It can’t be!

(B0079)

B:

¿Qu´ pasa? e
What happened?

A:

Mi computadora no est´ funcionando. a
My computer is not working.

B:

Rein´ ıciala.
Restart it.


Key Vocabulary

funcionar

Verb

to work

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Редактировать: Незначительное изменение строки NR == 1 для учета изменений в первой строке входного файла.Чтобы это работало, это зависит от того, что «A:» появляется только один раз в первой строке.

Я также должен добавить, что эта программа зависит от функций GNU AWK (gawk).

Кажется, есть некоторые несоответствия между вашими двумя выходными примерами.Программа ниже работает с первым.Во втором примере эта строка содержит заголовок и строку данных:

Элементарно - Мой компьютер не работает A: ¡Нет puede ser!

, и эта строка содержит символ, который должен быть заменен в строке, а не после окончательной пунктуации.

Rein´ ıciala.

Эти проблемы могутпри необходимости измените программу.

Кроме того, вы упоминаете, что эти символы будут разделены запятыми, но в примерах их нет (в том месте, где они могли появиться).Это не имеет значения, потому что моя программа игнорирует запятые.

Вы можете запустить следующую программу, например так:

$ ./scriptname inputfile

Вот она во всей ее простоте:

#!/usr/bin/awk -f
BEGIN {
    FS = "[.?!]"
    chars["n"] = "˜ñ"
    chars["N"] = "˜Ñ"
    chars["a"] = "´á"
    chars["A"] = "´Á"
    chars["e"] = "´é"
    chars["E"] = "´É"
    chars["ı"] = "´í"
    chars["I"] = "´Í"
    chars["o"] = "´ó"
    chars["O"] = "´Ó"
    chars["u"] = "´ú"
    chars["U"] = "´Ú"
}

/Key Vocabulary/ {exit}

    NR == 1 { sub(".*A: *","",$1) }

    /^\(.*\) *$/ || \
    /^(A|B): *$/ || \
    /^ *$/ \
        {next}

{
    punct = gensub($1"(.)"$2,"\\1","",$0)

    for (i=0; i<=length($2); i++) {
        char = substr($2,i,1);
        if (char != " ") {
            sub(substr(chars[char],1,1),substr(chars[char],2,1),$1)
        }
    }

    printf "%s%s;", $1, punct
    getline
    print
}
0 голосов
/ 28 сентября 2010

Я думаю, что это будет сложно с sed или awk…

Я предлагаю использовать для этого команды Perl или Vim (если вы знаете, что используете Vim):

Команда vim будет:

:%s/^.\{-}\zs´\(.*\.\) ı\(,\|$\)/í\1/
:%s/^.\{-}\zs´\(.*\.\) o\(,\|$\)/ó\1/
:%s/^.\{-}\zs´\(.*\.\) e\(,\|$\)/é\1/
: " etc

И повторять до тех пор, пока не будет больше гласной в конце строки после полной остановки.

\zs устанавливает начало матча, а \ 1 является обратной ссылкой на. *.заключите в квадратные скобки соответствующее соответствие регулярному выражению.

Если вы хотите обработать все PDF-файлы, выполните следующие действия:

vim *.pdf
:set hidden   "allows modifying a not-on-display buffer
:bufdo %s/^.\{-}\zs´\(.*\.\) ı\(,\|$\)/í\1/
:bufdo %s/^.\{-}\zs´\(.*\.\) o\(,\|$\)/ó\1/
: " etc
:next         "allows you to see other buffers to validate
:bufdo w      "will save all buffers
:q            "will quit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...