SED и кавычки Unicode

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

“… 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
задан 28.06.2012, 11:39

1 ответ

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

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

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

1
ответ дан 24.11.2019, 12:37

Теги

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