Некоторые символы UTF-8, не распознаваемые grep или sed

У меня есть простое обходное решение, которое включает 2 сценария строки. Это просто реэкспортирует $JAVA_HOME переменная к соответствующему пути, и затем вызывает основной сценарий оболочки приложения. Переуказание на Средство запуска Приложения KDE к этому новому сценарию запускает приложение как ожидалось.

Я все еще не уверен, почему я должен сделать это, хотя, так как я могу явно видеть корректное $JAVA_HOME определение переменной за пределами контекста моего изобретенного сценария. Таким образом, если кто-либо может пролить свет на то, почему это могло бы происходить, я счастливо отмечу это как соответствующий ответ для этого вопроса.

6
04.06.2014, 17:28
2 ответа

Проблема - это sort и uniq используют информацию о сопоставлении для локали. Выключение локали для двух работ команд:

cat sample | awk '{print $2}' | grep -o . | LC_ALL=C sort | LC_ALL=C uniq -c | sort -n
      1 ʊ
      1 ʌ
      1 a
      1 æ
      1 i
      1 v
      2 ʃ
      2 d
      2 t
      3 e
      3 l
      3 ɔ
      3 r
      4 ɪ
      4 n
      9 ˈ
      9 b
     11 ə
3
27.01.2020, 20:29
  • 1
    В то время как я соглашаюсь, выключают локали, решает проблему. Я не уверен в Вашей интерпретации. Я не вижу почему printf '%s\n' ɪ ʃ | uniq -c должен возвратиться 2 ɪ в любой локали. Это больше походит на ошибку в GNU uniq мне. Вы хотели бы расшириться? –  Stéphane Chazelas 09.08.2013, 18:29
  • 2
    @StephaneChazelas: Я не уверен, но я предполагаю, что эти два символа "эквивалентны" под локалью (они ничему не соответствуют). –  choroba 09.08.2013, 18:30
  • 3
    OK, я предполагаю sort не может гарантировать, что идентичный (как в от байта к байту) строки смежны, таким образом, uniq должен использовать strcoll там. Таким образом, Ваш ответ отлично к точке. И к сожалению, мы должны установить LC_ALL на C для обоих uniq и вид каждый раз, когда мы должны использовать uniq. –  Stéphane Chazelas 09.08.2013, 21:16
  • 4
    @StephaneChazelas: Хороший анализ. Я соглашаюсь, что результат неудачен, но неизбежен. –  choroba 09.08.2013, 21:19
  • 5
    @derobert, да U0234 кому: U07FF весь вид тот же (glibc 2.17). Это не может быть правильно. –  Stéphane Chazelas 09.08.2013, 21:29

при использовании локали «C» вы теряете человеческое сопоставление (например, создание эквивалентов «a» и «A»).

, если вам нужно как сопоставить, так и обработать некоторые символы, не обрабатываемые данными локали glibc; вы можете создать свой собственный языковой стандарт, расширив параметры сортировки по умолчанию.

Вы можете скопировать определение вашего текущего языкового стандарта (например, / usr / share / i18n / locales / en_US) на другое имя. Затем отредактируйте его и в разделе LC_COLLATE:

LC_COLLATE
copy "iso14651_t1"

reorder-after <e>
<U0259> <e>;<PCL>;<MIN>;IGNORE
reorder-after <s>
<U0283> <s>;<PCL>;<MIN>;IGNORE
reorder-end

END LC_COLLATE

скомпилируйте его с помощью: localedef -f ./yourmodifiedfile -t UTF-8 ./someplace , тогда вы можете использовать LC_ALL =. / someplace вместо LC_ALL = C

, если вы хотите использовать это регулярно, поместите созданный каталог с другими стандартными языковыми стандартами (обычно / usr / share / locale или / usr / lib / locale) и назовите его стандартным способом (например, если он основан на на en_US вы можете назвать его, например, "en_US @ IPA". Затем вы можете настроить свои локали на постоянное использование LC_COLLATE = en_US @ IPA (обратите внимание, что вы не должны определять LC_ALL, если хотите индивидуально определить некоторые LC_ * переменные)

Обратите внимание, что U + 02C8 является модификатором, поэтому его следует по праву игнорировать при сопоставлении. Но если вам нужно обрабатывать его как отдельный символ, вы можете использовать его вместо то же самое (для просмотра с подборкой), что и U + 02C8, вот как часто набирается):

# defines a handy symbol, to group together similar chars
collating-symbol <'>

# define 
reorder-after <z>
<'>

reorder-after <e>
<U0259> <e>;<PCL>;<MIN>;IGNORE
reorder-after <s>
<U0283> <s>;<PCL>;<MIN>;IGNORE
reorder-after <'>
<U0027> <'>;<BAS>;IGNORE;IGNORE
<U02C8> <'>;<PCL>;IGNORE;IGNORE

reorder-end

строки: <значение Unicode> <1-й уровень>; <2-й уровень>; <3-й уровень>; <4-й уровень> уровни - это то, что используется для их сортировки.

Я думаю (но не пробовал, я позволил это в качестве упражнения :)), что если вы просто определите последний уровень, он будет вести себя как в основном игнорируемый для сортировки, но все же «другой» с точки зрения uniq (до тех пор, пока так как цепочка всех уровней уникальна, я думаю, что персонаж уникален).

Обычно 1-й уровень является символом группировки, как и все буквы типа е. 2-й уровень обычно предназначен для основного символа, есть несколько других символов для различных версий с диакритическими знаками и (своеобразно?) используется для "особого". 3-й уровень обычно используется для различения прописных и строчных букв и тому подобного.

2
27.01.2020, 20:29

Теги

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