2016-09-26 7 views
0

で値を交換し、私は検索キーとXML

<name>abcdefg</name> 
<value>123456</value> 

の下に、私は「ABCDEFG」タグを検索するためにsedを使用してスクリプトを記述しようとしていますし、その後が対応する値を置き換えるようなXMLファイルを持っています "123456"しかし、残念ながら私は上記を達成するための論理を見つけることができません。 ヘルプが必要です。使用

+0

[beautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) HTMLからタグを読み込むのに適しています。 –

+0

あなたの構造はどのように見えますか?それは ' K1 V1 K2 V2'ですか?それとも、 ' K1 V1 K2 V2'のですか?構造がわからない場合は、意味的に対応した回答を提供できません。 –

+0

...そして、明らかに、意味論的ではない*答えは必然的にバグであろう:コメントとCDATAセクションとリテラルコンテンツとを区別することはできない。 –

答えて

2

サンプルデータ:

cat key 
<name>abcdaaefg</name> 
<value>123456</value> 
<name>abcdefg</name> 
<value>123456</value> 
<name>abcdaaefg</name> 
<value>123456</value> 

sed解決策:ファイルに変更を行うための

sed '/abcdefg/!b;n;c<value>OLA<value>' key 

<name>abcdaaefg</name> 
<value>123456</value> 
<name>abcdefg</name> 
<value>OLA<value> 
<name>abcdaaefg</name> 
<value>123456</value> 

sed -i.bak '/abcdefg/!b;n;c<value>OLA<value>' key 

awkソリューション:ラインの

awk '/abcdefg/ {print $0;getline;sub(/>.*</,">ola<")} {print $0}' key 
<name>abcdaaefg</name> 
<value>123456</value> 
<name>abcdefg</name> 
<value>ola</value> 
<name>abcdaaefg</name> 
<value>123456</value> 

検索はその後abcdefgを含有し、次の操作を実行:
1.印刷ライン、
次の行に2.moveと内部値を置き換えますhtmlタグを他のものに追加します。ここでは123456olaに置き換えました。

+0

こんにちは、お返事ありがとうございます。しかし、ファイル内のテキストをどのように置き換えるのですか? – user3198755

+0

'sed -i'を使用すると、これは置き換えで呼び出され、元のファイルの変更を行います。ファイルのバックアップを取っておきたい場合は 'sed -i.bak' –

+0

答えを改善するには、'/abcdefg /!b; n; c OLA ' –

0

あなたのデータでタグ - >値のペアを持っているときはいつでも、それはあなたのコード内のタグ - >値の配列を作成することをお勧めします:

$ awk -F'[<>]' '{tag=$2; v[tag]=$3} tag=="value" && v["name"]=="abcdefg" {sub(/>.*</,">blahblah<")} 1' file 
<name>abcdefg</name> 
<value>blahblah</value> 
+0

を参照してください。このコードは、XML準拠の観点からはあまり適切ではありません。たとえば、1行に1つの要素があると仮定すると、整形式文書の膨大な配列がひどく破損することになります。コンテンツがコメント化されているかどうかも認識されていません。さらに、XMLでは、文法ではなくリテラルであることが可能な状況があります。たとえば、 'CDATA'セクションです。 –

+0

合意。ここでXMLを解析することについてのほとんどの質問は、実際には非常に制限された方法で使用されているXMLを解析することなので、awkやその他のソリューションは通常適切ですが、YMMVなどのシェル変数を引用しない場合と同じケースにすることができます。 –

0

XML対応のツールを使用してください。これは、あなたのアプローチをはるかに堅固にするでしょう:それはテキストの記述の小さな変更(追加または削除された改行、または既存の要素に追加された追加の属性)がスクリプトを壊すことはないということを意味します。あなたはそれを編集することができます...

<config> 
    <item><name>abcdef</name><value>123456</value></item> 
    <item><name>fedcba</name><value>654321</value></item> 
</config> 

は、あなたの入力の構成は次のようになりますと仮定すると、(単一の親項目の下にあることを、ここにnamevalueとの間の関係を定義し、itemと呼ばれます)そのよう:

# edit the value under an item having name "abcdef" 
xmlstarlet ed -u '//item[name="abcdef"]/value' -v "new-value" 

代わりに、それは彼らを記述する名前/値のペアの間で注文すると(このようなものだ場合関係):

<config> 
    <name>abcdef</name><value>123456</value> 
    <name>fedcba</name><value>654321</value> 
</config> 

...あなたはそうのように編集することができます

# update the value immediately following a name of "abcdef" 
xmlstarlet ed -u '//name[. = "abcdef"]/following-sibling::value[1]' -v new-value