2014-12-09 3 views
-1

У меня есть XML-файл, этот файл должен быть изменено каждый раз, когда я бег моих сценариев, я должен найти определенную линию тамНайти и заменить строки в Баше

<data key='user.CC_MVFSModuleKernelPath,com.ibm.rational.clearcase.linux_x86' value='/lib/modules/2.6.32-279.el6.i686/build'/>

я не могу убедитесь, что эта строка будет с одним номером строки, есть ли способ найти эту строку и replcae значение, которое равно '/lib/modules/2.6.32-279.el6.i686/build'.

Входной файл, который я имею: <data key='user.Common_AdminDir' value='/var/adm/rational'/> <data key='user.Common_TempDir' value='/tmp'/> <data key='user.CC_LICENSE_MANAGER,com.ibm.rational.clearcase.linux_x86' value='IBMRCL'/> <data key='user.ATRIA_HOST_IS_REMOTE,com.ibm.rational.clearcase.linux_x86' value=''/> <data key='user.ATRIA_REMOTE_HOSTNAME,com.ibm.rational.clearcase.linux_x86' value=''/> <data key='user.ATRIA_LOCAL_KEY,com.ibm.rational.clearcase.linux_x86' value=''/> <data key='user.CC_IS_ATRIA_LICENSE,com.ibm.rational.clearcase.linux_x86' value='false'/> <data key='user.CC_MVFSModuleKernelPath,com.ibm.rational.clearcase.linux_x86' value='/lib/modules/2.6.32-279.el6.i686/build'/> <data key='user.CC_MVFSModuleRebuild,com.ibm.rational.clearcase.linux_x86' value='1'/> мне нужно заменить значение, которое находится в строке, которая держит следующую строку - MVFSModuleKernelPath,com.ibm.rational.clearcase я не знаю, что ток в этой линии, поэтому схемы поиска не может содержать строку в значении - и мне нужно заменить ее новым значением, например echo /lib/modules/ uname -r /build это значение будет в некоторой переменной valueToInsert Я хочу, чтобы иметь возможность печатать только значение в месте размещения и поместите некоторую переменную, чтобы сравнить ее с моей версией ядра, а затем замените ее

+0

возможный дубликат [Bash найти и заменить СЭД] (HTTP://stackoverflow.com/questions/12735788/bash-find-and-replace-with-sed) – tripleee

ответ

1

Вы можете использовать sed:

# printing current value 
sed -n "\#<data key='user\.CC_MVFSModuleKernelPath,com\.ibm\.rational\.clearcase\.linux_x86'#s~^.*value='\([^']*\)'.*$~\1~p" file.xml 
/lib/modules/2.6.32-279.el6.i686/build 

# replacement of the value by $valueToInsert 
sed -i.bak "\#<data key='user\.CC_MVFSModuleKernelPath,com\.ibm\.rational\.clearcase\.linux_x86'#s~^\(.*value='\)[^']*\('.*\)$~\1$valueToInsert\2~" file.xml 
+0

как я могу просто распечатать значение, чтобы сравнить его перед его заменой. – user3502786

+0

Команда печати, которую вы мне предоставили, работает nt есть проблема с '[', кстати, я думаю, что я не объяснил это правильным образом - я не знаю, что такое значение в строке, так как я могу просто напечатать e значение it self i можно быть уверенным, что эта строка начинается с этой строки ' user3502786

+0

Это печатает всю строку, как я могу напечатать просто значение, которое в этом случае - '/ lib/modules/2.6.32-279.el6.i686/build' – user3502786

1

Открыть замену файла и использования заменить значение «МОЙ НОВАЯ СТОИМОСТЬ».

Если мое «МОЕ НОВАЯ ЗНАЧЕНИЕ» в командной строке - это ваше новое значение, а использование символа «#» в разделителе в sed вместо использования «/» позволит избежать необходимости «/» символов.

xmllint my_xml_file|sed 's#key='user.CC_MVFSModuleKernelPath,com.ibm.rational.clearcase.linux_x86' value='/lib/modules/2.6.32-279.el6.i686/build'/>#key='user.CC_MVFSModuleKernelPath,com.ibm.rational.clearcase.linux_x86' value= MY NEW VALUE/>#g' 

Чтобы найти строки, выделите ее и распечатать его и потом изменять и печатать новую строку, вы можете попробовать следующее

xmllint xml_file| grep -o -E --color 'key='user.CC_MVFSModuleKernelPath,com.ibm.rational.clearcase.linux_x86' value='/lib/modules/2.6.32-279.el6.i686/build'/>' && xmllint my_xml_file|sed -n 's#key='user.CC_MVFSModuleKernelPath,com.ibm.rational.clearcase.linux_x86' value='/lib/modules/2.6.32-279.el6.i686/build'/>#key='user.CC_MVFSModuleKernelPath,com.ibm.rational.clearcase.linux_x86' value= MY NEW VALUE/>#p' 
+0

Не только «кошка» бесполезна, но и мешает вам использовать 'sed -i' для изменения файла на месте. – tripleee

+0

Ответ отредактирован .... с использованием «xmllint» должен работать должным образом. – repzero

+0

есть проблема с командами, которые вы мне предоставили, потому что я не знаю, что такое строка в значении, так что шаблон поиска не может включать его, есть ли в этом случае без него? не могли бы вы также предоставить другую команду, которая просто печатает строку в значении – user3502786

Смежные вопросы