Как проверить, содержит ли переменная допустимую строку UTF -8 без каких-либо управляющих символов?

  • внутри/<Directory \/>/,/AllowOverride None/(между этими строками)
  • sub(... )заменит NoneнаAll
  • a {print}требуется для всех строк (заменены или нет)

Обратите внимание, что строка (с )с AllowOverride Noneполучит subи print, все остальные строки будут напечатаны только.

образец файла:

<Directory />
   ## we don't want None
    AllowOverride None
   ## all or None-thing
</Directory>

станет

<Directory />
   ## we don't want All
    AllowOverride All
   ## all or None-thing
</Directory>

о дефолте, учтите

... | awk 'NF==7' 

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

6
01.03.2021, 08:07
1 ответ

Если локаль использует UTF -8 в качестве кодировки символов, (проверьте с помощьюlocale charmap):

[[ $string =~ ^[^[:cntrl:]]*$ ]]

должен работать, за исключением того, что, по крайней мере, в системах GNU, он не может отклонить строки, содержащие кодировку UTF -8 символов с кодовыми точками выше 0x110000 (, которые больше не действительны в текущем определении Кодировка UTF -8). Это связано с системной библиотекой регулярных выражений bash, используемой для сопоставления с образцом.

То же самое для GNU exprи :

.
expr " $string" : ' [^[:cntrl:]]*$' > /dev/null

Здесь вы можете переключиться на zsh, где в UTF -8 локалей

set -o extendedglob
[[ $string = [' '-$'\ud7fff'$'\ue000'-$'\U10FFFF']# && $string != *[[:cntrl:]]* ]]

должен работать согласованно независимо от системы (по крайней мере для сопоставления допустимых символов; вы можете найти различия между системами, для которых символ классифицируется как[:cntrl:]).

В шаблонах zsh glob диапазоны символов в локалях многобайтовых символов основаны на широком символьном значении символа, который в UTF -8 неизменно является кодовой точкой Unicode. Байтам, которые не являются частью допустимых символов, присваиваются значения wchar _t в диапазоне 0xDC80..0xDCFF во второй части суррогатных пар 0xD800..0xDFFF UTF16, которые не являются символами (a common санкционированный Unicode подход для обработки произвольных последовательностей байтов).

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

Вы также можете подумать, что делать с не -символами , символами личного использования , символами, которые в настоящее время не назначены в версии Unicode, с которой работает ваша система. с участием. Понятие управляющего символа также довольно размыто, когда дело доходит до Unicode. Являются ли символы U+202E RIGHT -TO -LEFT OVERRIDE, символ U+FEFF BOM, тегсимволы , например , управляют символами?

12
18.03.2021, 22:27

Теги

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