Прежде всего, это никогда не бывает хорошей идеей попытаться проанализировать XML или другой подобный структурированный текст с помощью регулярных выражений. Хотя теоретически можно сделать хорошо и безопасно, очень сложно даже для специалистов. Гораздо лучше использовать специальный инструмент, предназначенный для работы с вашим языком. Итак, если это файл XML, вы можете использовать что-то вроде xmlstarlet
вместо. Например, учитывая этот входной файл:
$ cat файл.xml
<?xml версия="1.0"?>
<идентификатор записи = "1">
<exciton lambda="1" fix="отверстие"/>
</запись>
Вы можете сделать:
$ значение = "1234"
$ xml ed -u "//record[@id=1]/exciton/@lambda" -v "$value" файл.xml
<?xml версия="1.0"?>
<идентификатор записи = "1">
<exciton lambda="1234" fix="отверстие"/>
</запись>
Все это говорит о том, что с очень минимальной информацией, которую вы нам предоставили, вполне возможно, что вы можете сделать это, используя простой, наивный синтаксический анализатор, такой как сед
. Есть разные трюки, которые вы можете попробовать. Во-первых, просто избегайте двойных кавычек:
$ sed "s/lambda=\"1\"/lambda=\"$value\"/" файл.xml
<?xml версия="1.0"?>
<идентификатор записи = "1">
<exciton lambda="1234" fix="отверстие"/>
</запись>
Или используйте одинарные кавычки, но завершите их и вставьте переменную в кавычках вне одинарных кавычек. Затем откройте новую строку одинарных кавычек, чтобы продолжить сед
выражение:
$ sed 's/lambda="1"/lambda="'"$value"'"/' файл.xml
<?xml версия="1.0"?>
<идентификатор записи = "1">
<exciton lambda="1234" fix="отверстие"/>
</запись>
Это немного сложно разобрать визуально, но это то, что он делает с добавленными пробелами для удобочитаемости (обратите внимание, что на самом деле он не работает с добавленными пробелами, это только для ясности):
sed 's/lambda="1"/lambda="' "$value" '"/' файл.xml
У вас есть два варианта. Во-первых, вы можете просто избежать двойного