Обновите параметр XML с пространством имен, используя xmlstarlet

Синтаксис

echoотличается от стандартных escape-последовательностей C, поддерживаемых printf/ awk/ $'...'...

В стандартном синтаксисе echoвам нужен начальный 0перед восьмеричной последовательностью (, которая может содержать от 1 до 3 цифр )¹:

echo '\0360\0237\0246\0204'

Обратите внимание: чтобы встроенная функция bashechoработала с этим, необходимо включить параметр 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 или выше )), также поддерживают эти \UXXXXXXXXescape-последовательности. последовательности в их аргументе формата (или аргументы для %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 локалях.

1
15.06.2021, 21:25
1 ответ

Ваша последняя попытка почти верна, но вы забыли добавить пространство имен в узлы 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
2
28.07.2021, 11:24

Теги

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