пытаюсь использовать printf для декодирования символов Юникода, переданных в качестве аргументов

Для фрагмента:

FILE=${1-data1}

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Results:"
cgrep -d "/////" -w "DEBUG" +w "END" "AAA" $FILE

это производится:

 Results:
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_TEL                  = {"001-1234-1234"}
: 
05 USER_LOCATION             = {"earth"}
[END]
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_ADDR                 = {"bla~ bla~~"}
:
010 JOB                       = {"designer"}
[END]

Код cgrep позволяет указать окно вокруг искомого текста(AAA ). Таким образом, в этом случае мы идем назад к DEBUG и вперед к END .

Мы использовали код ATT cgrep в течение многих лет. Его необходимо скомпилировать, но мы никогда не сталкивались с ошибками в этом процессе.

Вот некоторые подробности о cgrep:

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

С наилучшими пожеланиями... ура, дрл

3
14.04.2020, 14:46
1 ответ

Стандартная утилита printfне поддерживает управляющие последовательности \uxxxx, см.:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html

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

Другая проблема, по-видимому, заключается в вашем предположении, что вызов

printf '\u%s\n' 123

приведет к тому же результату, что и вызов:

printf '\u123\n'

Это не работает, так как printfанализирует строку формата поэлементно и не видит ожидаемой строки формата.

Таким образом, даже если вы используете bashдля выполнения скрипта, вы можете ожидать, что escape-последовательность обратной косой черты \uxxбудет расширена, если за ней следуют две шестнадцатеричных цифры, а escape-последовательность появляется буквально в строке формата. Если вы хотите расширить 4 шестнадцатеричных цифры, вам нужно буквально указать \Uxxxxв строке формата.

2
19.03.2021, 02:29

Теги

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