Почему Gnu сортирует по-разному на моем компьютере с OSX и на компьютере с Linux?

$ cat file
We \edit{introduce a} model for analyzing data from various
experimental designs, \edit{such as paired or longitudinal}.

$ sed 's/\(\\edit{\)\([a-z ]*\)\(}\)/\2/g' file
We introduce a model for analyzing data from various
experimental designs, such as paired or longitudinal.

Если ваш файл выглядит так:

$ cat file
We \edit{Introduce a} model for analyzing \emph{data} from various
experimental designs, \edit{such as 23 paired or longitudinal}.

Тогда тебе стоит попробовать:

sed 's/\(\\[a-z]*{\)\([A-Za-z0-9 ]*\)\(}\)/\2/g' file
We Introduce a model for analyzing data from various
experimental designs, such as 23 paired or longitudinal.

Если вы хотите сохранить \emph{data}, используйте :

.
$ sed 's/\(\\edit{\)\([A-Za-z0-9 ]*\)\(}\)/\2/g' file
We Introduce a model for analyzing \emph{data} from various
experimental designs, such as 23 paired or longitudinal.

Или более гладким способом:

$ sed 's/\\edit{\([^}]*\)}/\1/g' file
4
06.05.2017, 03:27
1 ответ

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


В macOS,/usr/share/locale/en_US.UTF-8/LC_COLLATE(или en_CA.UTF-8, то же самое )— это символическая ссылка на /usr/share/locale/la_LN.US-ASCII/LC_COLLATE, которая генерируется изla_LN.US-ASCII.srcс помощью colldef. Вот всеla_LN.US-ASCII.src:

# ASCII
#
# $FreeBSD: src/share/colldef/la_LN.US-ASCII.src,v 1.2 1999/08/28 00:59:47 peter Exp $
#
order \
    \x00;...;\xff

Вы можете убедиться, что двоичный файл LC_COLLATEдействительно сгенерирован из la_LN.US-ASCII.src, проверив контрольные суммы:

$ colldef -o /dev/stdout usr-share-locale.tproj/colldef/la_LN.US-ASCII.src | sha256sum
9ec9b40c837860a43eb3435d7a9cc8235e66a1a72463d11e7f750500cabb5b78  -

$ sha256sum </usr/share/locale/en_US.UTF-8/LC_COLLATE
9ec9b40c837860a43eb3435d7a9cc8235e66a1a72463d11e7f750500cabb5b78  -

Набор правил легко понять :просто сравните значения байтов одно за другим. Таким образом, правила сопоставления для en_US.UTF-8такие же, как и для локали POSIX (, также известной как локаль C ). {равно 0x7B, 2равно 0x32, поэтому {идет после 2.

Этот набор правил является артефактом FreeBSD 5, синхронизированным с Mac OS X 10.3 Panther. См. каталогcolldefв исходном дереве FreeBSD 5.0.0 . С тех пор он никогда не менялся в OS X / macOS.


В Linux локальные программы и данные являются частью glibc. См. дерево glibclocaledata/localesили /usr/share/i18n/localesв Debian/Ubuntu. Если вы просмотрите /usr/share/i18n/locales/en_US, вы увидите, что он использует iso14651_t1_commonдля LC_COLLATEправил. Таким образом, он следует правилам ISO 14651 для сопоставления.


Подробности в блоге:https://blog.zhimingwang.org/macos-lc_collate-hunt.

4
06.06.2020, 05:37

Теги

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