Замена кавычек на \ quotation и \ quote - PullRequest
2 голосов
/ 01 апреля 2012

У меня есть документ, содержащий много кавычек.Мне нужно заменить все пары " на \quotation{ (начало) и } (окончание) для использования в ConTeXt, например:

"Do not be afraid," said the tiger, "I am a vegetarian."

Это должно стать:

\quotation{Do not be afraid,} said the tiger, \quotation{I am a vegetarian.}
  • В документе нет вложенных кавычек.
  • Замена должна появляться только тогда, когда кавычки находятся попарно.Если строка имеет нечетное количество кавычек, то в эту строку не следует вносить изменения, так как это указывает на наличие ошибки.
  • Если между началом и концом появляется символ "/"в кавычках, тогда в эту строку следует внести изменения, так как это еще один признак ошибки.
  • Каждый абзац отображается в одной строке, поэтому код должен обрабатывать документ по одной строке за раз.

Как заменить эти кавычки на формат, используемый ConTeXt?

Ответы [ 5 ]

2 голосов
/ 01 апреля 2012

Другой способ:

perl -n -e '$a=$_;$a=~s/\"([^\"^\\]*)\"/\\quotation\{$1\}/g;print $a' < input
2 голосов
/ 01 апреля 2012

Вот мой awk код, который может быть не очень элегантным, но он выполняет свою работу.

{
    # split current line into several pieces using quotation char
    split($0, a, "\"")
    # and if the number of pieces is even, which implies that the number of quotation marks is odd
    if (length(a) % 2 == 0) {
        # Then error, unclosed quotation mark
        # Handle it in some other way if you want
        print
    } else {
        # the only pieces that need to be quoted are those on even positions in array
        # so we just surround them with the desired text
        for (i = 2; i <= length(a); ++i) {
            if (i % 2 == 0) {
                printf "%s", "\\quote{" a[i]
            } else {
                printf "%s", "}" a[i]
            }
        }
        # We should output end-of-line character manually to end the line
        printf "\n"
    }
}

Он работает, разбивая строку на части, используя кавычки, и сохраняет их в массиве a, например, строка «Не бойся», сказал тигр: «Я вегетарианец»:

a[1]: 
a[2]: Do not be afraid,
a[3]:  said the tiger, 
a[4]: I am a vegetarian.
a[5]: 

a [1] и a [5] оба пусты

2 голосов
/ 01 апреля 2012

Не идеально, но вы можете попробовать что-то вроде этого -

sed 's/"\(.[^"]*\)"/\\quotation{\1}/g' file

Тест:

[jaypal:~/Temp] cat file
"Do not be afraid," said the tiger, "I am a vegetarian."

[jaypal:~/Temp] sed 's/"\(.[^"]*\)"/\\quotation{\1}/g' file
\quotation{Do not be afraid,} said the tiger, \quotation{I am a vegetarian.}
2 голосов
/ 01 апреля 2012

Это звучит как ужасная вещь для автоматизации;сложность может быть впечатляющей:

She said, "Don't say 'stupid', or I'll smack you.", to John's girlfriend.

Нет хорошего способа определить разницу между встроенной цитатой, сокращениями, притяжательными цитатами и вложенностью, которая может быть ужасной для соответствия.Где-то забытая заключительная цитата может полностью испортить вывод.(Я видел десятки пропущенных цитат, например, в книгах Терри Пратчетта. Ваш контент в лучшей форме?)

1 голос
/ 01 апреля 2012

Это может работать для вас:

echo -e 'a "b" c "d" e\na "b" c "d e\na "b" c "d/d" e' |
sed 'h;s/"\([^"/]*\)"/\\quotation{\1}/g;/"/{g;s/^/ERROR: /}'
a \quotation{b} c \quotation{d} e
ERROR: a "b" c "d e
ERROR: a "b" c "d/d" e

, если вы не хотите сообщение ERROR, тогда:

echo -e 'a "b" c "d" e\na "b" c "d e\na "b" c "d/d" e' | 
sed 'h;s/"\([^"/]*\)"/\\quotation{\1}/g;/"/g'
a \quotation{b} c \quotation{d} e
a "b" c "d e
a "b" c "d/d" e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...