Синтаксис
echo
отличается от стандартных escape-последовательностей C, поддерживаемых printf
/ awk
/ $'...'
...
В стандартном синтаксисе echo
вам нужен начальный 0
перед восьмеричной последовательностью (, которая может содержать от 1 до 3 цифр )¹:
echo '\0360\0237\0246\0204'
Обратите внимание: чтобы встроенная функция bash
echo
работала с этим, необходимо включить параметр xpg_echo
²:
$ UNICORN_utf8_printf_format='\360\237\246\204'
$ UNICORN_utf8_echo='\0360\0237\0246\0204'
$ UNICORN_utf8=$'\360\237\246\204'
$ printf "$UNICORN_utf8_printf_format\n"
$ printf '%s\n' "$UNICORN_utf8"
$ shopt -s xpg_echo
$ echo "$UNICORN_utf8_echo"
Выше только $UNICORN_utf8
содержит символ, закодированный в UTF8. Другие содержат последовательности обратной косой черты и цифр, которые должны быть расширены соответствующими инструментами.
Формат %b
утилиты printf
также понимает те же последовательности, что и echo
. %b
был фактически добавлен, чтобы мы могли избавиться от echo
, который невозможно использовать портативно и надежно .
$ printf '%b\n' "$UNICORN_utf8_echo"
См. также (в zsh
и bash
³):
UNICORN_locale_encoding=$'\U1f984'
Что дает вам Единорога, закодированного в кодировке локали, что заставит его работать, даже если кодировка локали не была UTF -8, а также имел этот символ (, вероятно, только GB18030, где кодируется как $'\225\60\330\66'
и где $'\360\237\246\204'
будет кодировкой馃
(\N{CJK UNIFIED IDEOGRAPH-9983}\N{
)).
Некоторые printf
реализации (, включая GNU printf
и printf
, встроенные в zsh
, ksh93
и последние версииbash
(4.2 или выше )), также поддерживают эти \UXXXXXXXX
escape-последовательности. последовательности в их аргументе формата (или аргументы для %b
, за исключением ksh93 ); GNU нужно 8 цифр.
¹ GNU coreutils echo
и busybox echo
поддерживают \ooo
с -e
в качестве расширения (, но не тогда, когда POSIXLY_CORRECT
находится в среде для GNUecho
)
² другим вариантом может быть использование нестандартной -опции -e
, но тогда она не будет работать, когда включены обе опции posix
и xpg_echo
, например, когда bash
в UNIX режим соответствия.
³ ksh93 и mksh также поддерживают этот синтаксис, но кодируются в UTF -8 независимо от кодировки локали; в текущих (2018 )версиях FreeBSD sh
вам нужно \U0001f984
, и это работает только в UTF -8 локалях.
Ваша последняя попытка почти верна, но вы забыли добавить пространство имен в узлы name
и value
:
xmlstarlet ed \
-N s=http://bla.com/engine/management/engineConfiguration \
-u '/s:engineConfiguration/s:engineParameter[s:name = "POS_PRINTER_PORT_ID"]/s:value' \
-v 9999 file.xml
Или использовать параметры, импортированные из командной строки, а не жестко -закодированные значения в выражениях:
xmlstarlet ed \
-N s='http://bla.com/engine/management/engineConfiguration' \
--var n "'POS_PRINTER_PORT_ID'" --var v "'9999'" \
-u '/s:engineConfiguration/s:engineParameter[s:name = $n]/s:value' \
-x '$v' file.xml
Использованиеxq
:
xq -x '(.engineConfiguration.engineParameter[] |
select(.name == "POS_PRINTER_PORT_ID").value ) |= 9999' file.xml
С параметрами:
xq --arg n 'POS_PRINTER_PORT_ID' --arg v 9999 \
-x '(.engineConfiguration.engineParameter[] |
select(.name == $n).value ) |= $v' file.xml