2016-12-14 2 views
1

例:sedを持つ2つのパターンの間の文字列を置き換えます - エラーなし、ノー結果、私はユーザー名を変更したいファイルから

<host><![CDATA[localhost]]></host> 
<username><![CDATA[root]]></username> 

Here is my regex testそれが一致することを確認します。

し、エラーなしで完了し、何も変わりません最終的にはsedコマンド:これは結果でなければなりません

sed -i -e 's/(<username><!\[CDATA\[).*(\]\]><\/username>)/TEST/g' path/to/file.xml 

を:それは全く交換しないだけでなく

<host><![CDATA[localhost]]></host> 
TEST 

、私は前後のキャプチャグループを維持するために、このように動作する必要があります。ユーザ名を有効に置き換えるだけです。

sed -i -e 's/(<username><!\[CDATA\[).*(\]\]><\/username>)/\1TEST\2/g' path/to/file.xml 

しかし、それは、このエラーを返します:

sed: -e expression #1, char 57: invalid reference \2 on `s' command's RHS 

だから私はそれは本当に最初の場所で何かを交換しないで置き換えますこれは、それらをキャプチャしていないので、キャプチャグループが緩く何とかに一致していると思いますか?行は、ユーザ名が含まれている場合

、:はるかに洗練された可能性があり

<host><![CDATA[localhost]]></host> 
<username><![CDATA[TEST]]></username> 
+2

なぜXMLを解析するために正規表現を使用していますか?とにかく、キャプチャグループがありません。拡張正規表現構文を使用するには、 '\(.. \)'または(GNU sedで) '-r'オプションを追加する必要があります。 –

+0

必ずしもXMLを解析する必要はなく、2つのパターン間のテキストを置き換えるだけです。あなたのコメントのアドバイスは、私がそれを働かせる方法です、だからありがとう。私は単に拡張正規表現について知らなかった。これは私のSEDが私のループでどのように見えるかです: 'sed -i -r -e '/(<'"$key"'><!\ [CDATA \ [)。*(\] \]><\/'"$key"'>)/ \ 1'" $ {db_local [$ key]} '' '\ 2/g' $ {path_local [site]}/path/to/file.xml' –

答えて

0

可能awkのソリューション::すなわち

awk '{if ($0 ~ /username/) gsub(/CDATA\[.+\]/, "CDATA[TEST]"); print $0 }' file.txt 

私が欲しい

最終結果はこれですCDATA []のすべてのインスタンスをCDATA [TEST]でサブアウトします。これにより、行が変更されます。次に、各行を印刷します。正規表現は、必要に応じてさらに洗練されています。

0
awk '{sub(/root/,"TEST")}1' file 

<host><![CDATA[localhost]]></host> 
<username><![CDATA[TEST]]></username> 
+2

あなたの答えについての説明を与えることをお勧めします – Mikkel

関連する問題