как удалить специальные символы с помощью sed

Версия .NET 4.0 сделала большое изменение в способе сборки ссылок на базу. Ранее эталонная сборка была простой копией сборки времени выполнения, той, которая хранится в GAC. Это, однако, вызвало некоторые болезненные проблемы. Примечательна перегрузка WaitHandle.WaitOne(int), она была добавлена ​​в обновление .NET 2.0 с пакетом обновления 2 (ака .NET 3.5). Программисты использовали его, не заметив, что это добавленный метод , номер версии сборки mscorlib все еще был 2.0.0.0. Но затем они обнаружили, что их программа завершилась неудачей при запуске на неподдерживаемой версии .NET 2.0. Очень неприятный kaboom, MissingMethodException без подсказки, почему такой общий метод может отсутствовать.

Чтобы предотвратить этот разрыв, сборки ссылок .NET 4.0 сохраняются отдельно, в разделе «% programfiles%\reference Assemblies ", как вы узнали. И они - специальные сборки, они содержат только метаданные со всеми ИЛ. Вот почему сборка намного меньше.

Microsoft теперь может улучшить код .NET 4 и добавить общедоступные классы и методы, не вызывая такого рода поломки. И сделали это обильно, обновления 4.01, 4.02 и 4.03 отправлены с момента выпуска оригинала 4.0.

Причина, по которой у вас возникают проблемы с классом DataContractSerializerSetting, легко объясняется, она просто не появляется в контрольной сборке. Он добавлен, вероятно, в одном из этих дополнительных обновлений. И вы не должны пытаться, ваша программа будет ломаться на машине, у которой нет обновления. Вы должны подождать до .NET 4.5, версии, которая добавила его в ссылочную сборку. Вы можете вызвать DLL Hell, если хотите.

-1
задан Matt 13 July 2018 в 08:57
поделиться

3 ответа

Если вы хотите, чтобы sed не учитывался, например. Арабские символы должны быть алфавитными (они есть), вам нужно установить локаль, которая их не учитывает.

Локаль «C» учитывает только базовый набор символов, т. Е. Только [A-Za-z] являются алфавитными , Я предполагаю, что вы хотите удалить все, что не является символом этого диапазона (ваш вопрос нечеткий о том, что вы действительно хотите):

echo -e "A \xd8\xa8" | LC_CTYPE=C sed -r "s/[^[:alpha:]]//g" | hexdump -C

Выход:

00000000  41 0a
00000002
2
ответ дан DevSolar 17 August 2018 в 13:18
поделиться
  • 1
    звучит неплохо, но немного сложно изменить внешнюю переменную, чтобы выполнить работу. – Matt 13 July 2018 в 12:39
  • 2
    @Matt: Если вы используете его "inline" как я покажу здесь, без «экспорта», он изменяется только для подчиненной функции, выполняющей sed, не влияя на вызывающую среду. И переменные среды LC_ / LANG - это способ установки языкового стандарта. Это может показаться «сложным». для вас, но то, что вы хотите, - это другой язык. – DevSolar 13 July 2018 в 12:42

Необработанный текст:

$ echo -e 'A \xd8\xa8' | od -c
0000000   A     330 250  \n
0000005

Удалить символы не-ascii:

$ echo -e 'A \xd8\xa8' | sed 's/[^\x00-\x7F]//g' | od -c
0000000   A      \n
0000003

Удалить пробелы:

$ echo -e 'A \xd8\xa8' | sed 's/[[:space:]]//g' | od -c
0000000   A 330 250  \n
0000004

Удалить символы не-ascii и пробелы:

$ echo -e 'A \xd8\xa8' | sed 's/[^\x00-\x7F]//g; s/[[:space:]]//g' | od -c
0000000   A  \n
0000002

$ echo -e 'A \xd8\xa8' | sed -E 's/[^\x00-\x7F]|[[:space:]]//g' | od -c
0000000   A  \n
0000002
2
ответ дан Ed Morton 17 August 2018 в 13:18
поделиться
  • 1
    $ echo -e 'A \ xd8 \ xa8' | sed 's / [^ \ x00- \ x7F] // g' | od -c sed: -e выражение # 1, char 17: Недопустимый символ сортировки 0000000 $ sed --version sed (GNU sed) 4.4 – Matt 13 July 2018 в 16:02
  • 2
    Я на той же версии. Попробуйте установить свой язык на C (... | LC_ALL=C sed '...'), так как быстрый Google показывает, что люди сообщают об этой ошибке в некоторых локалях и рекомендуют использовать локаль C для ее исправления. – Ed Morton 13 July 2018 в 16:16

Попробуйте следующее:

$ echo -e "A \xd8\xa8 ña ñe ño áÄãç " | sed -r "s/[^a-zA-Z0-9]//g"
Aaeo

Альтернативой будет печать всего диапазона ASCII (но символа пробела и управляющих символов):

$ echo -e "A \xd8\xa8 ña ñe ño áÄãç " | sed -r "s/[^\x21-\x7F]//g"
Aaeo
-1
ответ дан Julio 17 August 2018 в 13:18
поделиться
  • 1
    все еще не работает в версии 4.2.2 ... Или, может быть, подсистема windows для Linux, которая багги ... – Matt 13 July 2018 в 09:16
  • 2
    Только для справки: я использовал cygwin и sed версии 4.4 – Julio 13 July 2018 в 09:20
  • 3
    Просто протестировал его с арабским персонажем в версии 4.4 и все еще не работает – Matt 13 July 2018 в 09:38
  • 4
    @Matt Что вы получаете с этими двумя командами? Ответ DevSolar работает для вас? – Julio 13 July 2018 в 10:35
  • 5
    он работает для первого случая (который действительно явный), но не второго. Его вывод - пустая строка. – Matt 13 July 2018 в 12:28
Другие вопросы по тегам:

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