/ / bash、awk、sedの文字列の検索と置換

bash-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 私は最初の場所にちょうど価値を印刷し、私の既存のカーネルバージョンと比較するためにいくつかの変数を入れて置き換えることができるようにしたい

回答:

回答№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"