Согласно POSIX, диапазоны выражений в квадратных скобках указываются только на основе кодовой точки в локали C/POSIX. В других регионах это не указано и часто зависит от порядка сортировки, как вы узнали. Вы обнаружите, что в некоторых локалях, в зависимости от инструмента, [g-j]
, например, включает i
, но также и ı
, ǵ
, иногда даже I
или даже ch
, как в некоторых чешских локалях.
zsh
— один из тех редких, чьи диапазоны [x-y]
основаны на кодовой точке независимо от локали. Для однобайтовых наборов символов -это будет основано на значении байта, для многобайтовых -байтовых — на кодовой точке Unicode или на том, что система использует для представления широких символов внутри с mbstowc()
и ко. API (обычно Unicode ).
Так в zsh
,
[[ $char = [$'\u452'-$'\u490'] ]]
[[ $char = [^ђ-Ґ] ]]
y=${x//[^ђ-Ґ]/}
будет работать в вашем случае для сопоставления символов в этом диапазоне Unicode при условии, что кодировка локали является многобайтовой -и имеет эти два символа. Существуют однобайтовые наборы символов -, которые содержат некоторые из этих символов (, например ISO8859 -5, в котором большинство из них находятся в U+0401..U+045F ), но в локалях, которые их используют, диапазоны [ђ-Ґ]
будут основываться на кодовой точке байтового значения (в соответствующем наборе символов, а не на кодовой точке Unicode ).
В локали C диапазоны основаны на кодовой точке, но набор символов в локали C гарантированно включает только символы из переносимого набора символов , который представляет собой лишь несколько символов, необходимых для написания POSIX. или код C (, ни один из которых не написан кириллицей ). Также гарантируется одиночный -байт , поэтому он не может включать все символы, указанные в Unicode. На практике чаще всего это ASCII.
На практике вы не можете установить LC_COLLATE
на C, не установив также LC_CTYPE
на C (или, по крайней мере, локаль с одной -байтовой кодировкой ). Однако многие системы имеют локаль C.UTF-8
, которую вы можете использовать здесь.
UTF -8 — это один из тех наборов символов, которые могут представлять все символы Unicode, а значит, и все символы любой кодировки. Так что вы могли бы сделать:
< file iconv -t utf-8 |
LC_ALL=C.UTF-8 sh -c 'sed "$(printf "s/[^\321\222-\322\220]//g")"' |
iconv -f utf-8
Первое iconv
преобразование из кодировки локали пользователя в UTF -8, \321\222
и \322\220
представляет собой кодировку UTF -8 U+0452 и U+0490 соответственно, второе iconv
преобразование обратно в кодировку локали.
Если текущая локаль уже использует UTF -8, так как кодировка (и file
записываются с использованием этой кодировки ), это можно упростить до:
<file LC_ALL=C.UTF-8 sed 's/[^ђ-Ґ]//g'
или:
<file LC_ALL=C.UTF-8 sed "$(printf "s/[^\321\222-\322\220]//g")"
С помощью GNU sed
и при условии, что $POSIXLY_CORRECT
не находится в среде, вы можете указывать символы на основе значения байтов их кодировки.
<file LC_ALL=C.UTF-8 sed 's/[^\321\222-\322\220]//g'
Хотя в старых версиях вам может понадобиться:
<file LC_ALL=C.UTF-8 sed 's/[^\o321\o222-\o322\o220]//g'
Или шестнадцатеричный вариант:
<file LC_ALL=C.UTF-8 sed 's/[^\xd1\x92-\xd2\x90]//g'
Другой вариант,для локалей, использующих многобайтовый набор символов -, который включает эти символы в системах, где широкоформатное представление символов основано на Unicode, следует использовать GNU awk
и:
awk 'BEGIN{for (i = 0x452; i<=0x490; i++) range = range sprintf("%c", i)}
{gsub("[^" range "]", ""); print}'
(Первоначально я считал, что POSIX требует, чтобы реализации awk вели себя как GNU awk, но это не так, поскольку POSIX оставляет поведение sprintf("%c", i)
неопределенным для значений i
, которые не соответствуют кодировке .(не кодовая точка )символа в локали. Это означает, что его нельзя использовать переносимо для многобайтовых -символов ).
В любом случае обратите внимание, что диапазон U+0400.. U+052F — не единственные символы Unicode в кириллице , не говоря уже о языках, использующих кириллицу в качестве письма. Список символов также зависит от версии Unicode.
В системе, подобной Debian -, вы можете получить их список с помощью:
unicode --max 0 cyrillic
(, что дает 435 различных на Ubuntu 16.04, 444 на Debian sid (, вероятно, использующих другую версию Unicode ).
В perl
см. \p{Block: Cyrillic}
, \p{Block: Cyrillic_Ext_A,B,C}
, \p{Block: Cyrillic_Supplement}
... для сопоставления блоков Unicode и \p{Cyrillic}
для сопоставления символов кириллицы (, назначенных в настоящее время в версии Unicode, которая ваша версия perl
использует (см. perl -MUnicode::UCD -le 'print Unicode::UCD::UnicodeVersion'
, например )).
Так:
perl -Mopen=locale 's/\P{Cyrillic}//g'
Что вы можете сделать, так это создать файл SPEC и заставить rpmbuild
его использовать. В этом файле вы можете включить различные параметры в процесс сборки. Вы можете проверить здесь , например, использование файла SPEC
- In a shell prompt, go into the buildroot and create a new spec file for your package.
- Open the spec file in a text editor. The spec file should be similar to the following example:
%build
%configure
make %{?_smp_mflags}
....
- Edit the BuildRequires tag with requirements that are needed to build the package. BuildRequires can contain either a list of required packages or files. For example, the eject package requires the gettext and libtool packages.....
Я понял, чем действительно хочу заниматься, а именно
rpmbuild --define "_with_pmix --with-pmix=/path/to/pmxi" -ta slurm-19.05.5.tar.bz2