在bash中查找和替换字符串

时间:2014-12-09 09:57:19

标签: bash awk sed

我有XML文件,每次运行我的脚本时都必须更改此文件,我必须在那里找到一个特定的行

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

我无法确定此行是否在同一行号,是否有任何方法可以找到此行,并重新定位'/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中 我希望能够在第一个地方打印一个值并输入一些变量,以便与我现有的内核版本进行比较然后替换它

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

打开文件并使用替换值替换“MY NEW VALUE”。

在命令行中我的“我的新值”是你的新值,也是在sed中使用#as delimiter而不是使用“/”将避免必须转义“/”字符。

 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'