Рейтинг:4

Использование sed с переменной внутри двойной кавычки

флаг kr

у меня есть файл ввод.xml который содержит строку: <exciton lambda="1" fix="hole"/>

в этой строке я хочу заменить 1 на 2, но я не могу использовать просто 1 как ключевое слово, поскольку в том же файле есть другие экземпляры «1», поэтому я должен использовать ключевое слово лямбда = "1"

Я пытаюсь использовать команду sed, как показано ниже:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

Но это не работает, может кто-нибудь, пожалуйста, помогите.

Рейтинг:5
флаг cn

Прежде всего, это никогда не бывает хорошей идеей попытаться проанализировать 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

У вас есть два варианта. Во-первых, вы можете просто избежать двойного

Рейтинг:2
флаг tj

Я пытаюсь использовать команду sed, как показано ниже:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

Предполагая стоимость уже определено, заключите переменную в одинарные кавычки: '$ значение':

sed -i 's/lambda="1"/lambda="'$value'"/g' input.xml

РЕДАКТИРОВАТЬ как указал @terdon, если ваш стоимость переменная содержит пробелы, описанное выше не будет работать, и вам нужно будет заключить переменную в двойные кавычки в одинарных кавычках:

sed -i 's/lambda="1"/lambda="'"$значение"'"/g' input.xml

terdon avatar
флаг cn
Это не удастся, если `$value` содержит пробелы.Это потому, что вы на самом деле не заключаете здесь `$value` в одинарные кавычки. Ведь переменные, заключенные в одинарные кавычки, не раскрываются. Кавычки просто заканчивают выражение `sed` в одинарных кавычках и начинают новое. Чтобы сделать это безопасным, вам нужно: `sed -i 's/lambda="1"/lambda="'"$value"'"/g' input.xml`.
fuzzy drawings avatar
флаг tj
OP указал, что `value` будет **2** (другое целое число), но да, это не удастся, если вместо этого он использует значение, содержащее пробелы или окончания строк. Думаю, мне нужно привыкнуть всегда использовать переменные в двойных кавычках.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.