SED и Unicode кавычки

3439
Jonathan Patt

При тестировании по этой строке:

“… so that’s that… ” 

Следующее должно, но не совпадать с открывающей кавычкой и после многоточия и пробела:

sed "s/\([“‘\"']…\) /\1/g" 

Однако это правильно соответствует второму многоточию и следующему пробелу и закрывающей кавычке:

sed "s/… \([”’\"'.!?]\)/…\1/g" 

Если я разделю первый на части, он будет работать нормально:

sed -e "s/\(“…\) /\1/g" \ -e "s/\(‘…\) /\1/g" \ -e "s/\(\"…\) /\1/g" \ -e "s/\('…\) /\1/g" 

Так почему же он не работает, когда он сгруппирован вместе? Особенно, когда он отлично работает с закрывающими кавычками.

0
Я могу ошибаться в этом, но во втором утверждении sed (sed "s /… \\ ([” '\ "'.!?] \\) /… \ 1 / g"), точка '(в квадратные скобки (перед! и?) должны соответствовать любому символу, поскольку он не был экранирован, поэтому вы ищете многоточие, за которым следует пробел, за которым следует любой один символ (или любой другой из перечисленных символов). Creepygeek 14 лет назад 0
Насколько я могу судить, похоже, что это не так - период, по-видимому, не действует как подстановочный знак, если он находится в квадратных скобках. Jonathan Patt 14 лет назад 0

1 ответ на вопрос

1
bobince

Какую версию sedвы используете? Я считаю, что GNU sed должен поддерживать символы Unicode, и ваш пример работает для меня в Linux (Ubuntu, со средой UTF-8).

Если вы используете версию sed, которая не поддерживает Unicode, ваша группа символов будет повреждена, потому что она соответствует только одному байту. Если ваша командная строка использует кодировку UTF-8, когда вы говорите, что sed, не поддерживающий Юникод, на самом деле будет видеть три байта \xE2, \x80и \x9C. Это поднимет вашу группу персонажей, которая будет соответствовать только одному из этих байтов за раз. Различные другие конструкции тоже потерпят неудачу, например. a”?это буква 'a', затем два байта, за которыми следует необязательный третий байт, поэтому сам aпо себе он не будет соответствовать выражению, хотя выглядит так, как должно.

(Возможно, вы захотите рассмотреть также замену символа многоточия тремя периодами. Многоточие - это символ совместимости в Юникоде; обычно считается более современным выписать точки и позволить шрифту позаботиться о наборе текста.)

Я использовал любую версию `sed`, поставляемую с OS X 10.6, - не смог определить, какая это версия, - но я только что установил` gsed`, и она отлично работает там. Спасибо! Что касается многоточия, то это для личного проекта, где я предпочитаю использовать символы многоточия в течение трех периодов, и, если это необходимо, их легко конвертировать позже. Jonathan Patt 14 лет назад 0
Я думаю, что вы получили это задом наперед: `...` - это версия совместимости правильного многоточия `…`. Не современнее использовать `...` вместо `…`, и использование символа многоточия * позволяет * шрифту делать правильные вещи - вот почему символ многоточия есть. Andrew Marshall 12 лет назад 0

Похожие вопросы