У меня есть файл со следующим содержанием:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
и мне нужно сделать скрипт, который меняет «имя» в первой строке на «что-то», «пароль» во второй строке на «что-то другое», а «имя» в третьей строке на «что-то другое». Я не могу полагаться на порядок их появления в файле, поэтому я не могу просто заменить первое вхождение «name» на «что-то», а второе вхождение «name» на «что-то другое». Мне действительно нужно выполнить поиск окружающих строк, чтобы убедиться, что я нахожу и заменяю правильную вещь.
До сих пор я пробовал эту команду, чтобы найти и заменить первое вхождение «имя»:
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
однако это не работает, поэтому я думаю, что некоторым из этих персонажей, возможно, понадобится убежать и т. д.
В идеале я хотел бы использовать регулярные выражения, чтобы просто сопоставить два вхождения "имя пользователя" и заменить только "имя". Как то так, но с sed
:
<username>.+?(name).+?</username>
и заменить содержимое в скобках на «что-то».
Это возможно?
источник
Ответы:
Это, я думаю, то, что вы ищете.
Объяснение:
\1
,\2
и т. д. во второй части - ссылки на i-ю группу, захваченную в первой части (нумерация начинается с 1)-E
включает расширенные регулярные выражения (необходимые для+
и группировки).источник
(original name) + "-E"
.\(
и\)
вместо(
и)
.Значение
/username/
befores
указывает sed работать только со строками, содержащими строку username.источник
Если
sed
это не сложное требование, лучше использовать специальный инструмент.Если ваш файл является допустимым XML (а не только этими тремя XML-выглядящими тегами), то вы можете использовать XMLStarlet :
Вышеуказанное также будет работать в ситуациях, которые трудно решить с помощью регулярных выражений:
Краткая демонстрация вышесказанного:
источник
Вы должны заключить
\[.*^$/
в кавычки в части регулярного выраженияs
команды и\&/
в части замены, плюс новые строки. Регулярное выражение является базовым регулярным выражением , и, кроме того, вам нужно заключить в кавычкиs
команду.Вы можете выбрать другой разделитель, чтобы избежать цитирования
/
. Вместо этого вам придется заключать в кавычки этот символ, но обычно смысл изменить разделитель, чтобы выбрать тот, который не встречается ни в тексте для замены, ни в тексте замены.Вы можете использовать группы, чтобы избежать повторения некоторых частей в тексте замены и учесть различия в этих частях.
источник
Вы можете просто использовать адреса как в числе, предшествующем "s", которое указывает номер строки.
Кроме того, число в конце говорит,
sed
чтобы заменить второе совпадение вместо замены первого совпадения.источник
Для замены слова «имя» словом «что-то» используйте:
Это заменит все вхождения указанного слова.
Пока все выводится на стандартный вывод, вы можете использовать:
сохранить изменения в другом файле.
источник
чтобы заменить значение в файле свойств
источник