私は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
私は最初の場所にちょうど価値を印刷し、私の既存のカーネルバージョンと比較するためにいくつかの変数を入れて置き換えることができるようにしたい
回答:
回答№1は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$valueToInsert2~" file.xml
回答№2の場合は1
ファイルを開き、置換を使用して値を「MY NEW VALUE」に置き換えます。
"/"を使用する代わりにsedの区切り記号として#を使用すると、コマンドラインで "MY NEW VALUE"を新しい値にしても、 "/"文字をエスケープする必要はありません。
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"