文字列検索、成功後最も近いパターン検索

文字列検索、成功後最も近いパターン検索

XML形式のファイルがあります。

 {XML file with similar tags - SubRecord and Property}
 ...

 <SubRecord>
 <Property Name="Name">My Main Search Keyword</Property>
 <Property Name="Prompt">Dummy</Property>
 <Property Name="Default">Value i'm Concerned to Modify</Property>
 </SubRecord>

 ...

私の要求。この特定のサブレコードの「デフォルト」値を取得し、条件に応じて更新します。これを行うには、この特定のタグ「name」にアクセスしてその値を変更する必要があります。

SED/AWK/GREPを使用する方法はありますか?

編集:@terdonのアップデートに基づいています。

  • すべてのセクションに1行しかありませんか?いいえ
  • デフォルトは常に最後の値ですか?常に上から3番目(名前、プロンプト、デフォルト)
  • 大文字と小文字を区別しますか?それはすべてですか?大文字と小文字を区別します。
  • 空行がありますか?そうではありません。しかし、それを取り除くために事前準備をすることはできます。
  • ファイルがインデントされていますか?はい。

例: ...

 <SubRecord>
 <Property Name="Name">Search</Property>
 <Property Name="Prompt">Some Text</Property>
 <Property Name="Default">abc.txt</Property>
 </SubRecord>

 ...

同様の属性とサブレコードを持つ大規模なXMLファイルで、まず「検索」パラメータのすべての属性を見つける必要があります。

「検索」を見つけたら、デフォルト値を確認する必要があります。 abc.txt の場合はその値を保持し、xyx の場合は継続する必要があります。 abc.txtまたはxyzの代わりにabc.txtに更新する必要があります。

答え1

XMLはXMLをサポートするツールとして扱われるべきです。

XMLStarletはそのようなツールです。

Property属性があり、値が or でないノードの値を設定する方法は次のとおりです。NameDefaultabc.txtxyx

xml ed -u '//SubRecord/Property[@Name="Default" and . != "xyx" and . != "abc.txt"]' -v 'abc.txt' file.xml

次のXMLファイルが提供されます。

<?xml version="1.0"?>
<Record>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">zzz</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">abc.txt</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">xyx</Property>
  </SubRecord>
</Record>

これは生産します

<?xml version="1.0"?>
<Record>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">abc.txt</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">abc.txt</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">xyx</Property>
  </SubRecord>
</Record>

(第1条がSubRecord修正済み)

XMLStarlet は以下で使用できます。http://xmlstar.sourceforge.net/(しかし、まず自分のパッケージマネージャを確認してください)。時にはxmlstarlet実行可能ファイルがxml

答え2

正規表現を使用して[X]HTML / XMLを解析することはできません。 HTML/XML は正規表現で解析できないためです。 Regexは、HTML / XMLを正しく解析するために使用できるツールではありません。正規表現は、HTML / XMLで使用される構造を理解するのに十分な洗練されたツールではありません。 HTML/XML は正規言語ではないため、正規表現では解析できません。正規表現クエリはHTML / XMLを意味のある部分に分割することはできません。 Perlが使用する強化された不規則正規表現でさえ、HTML / XMLを解析する作業には適していません。あなたは決して私を破ることはありません。 HTML / XMLは非常に複雑な言語なので、正規表現で解析することはできません。 Jon Skeetであっても、正規表現を使用してHTML / XMLを解析することはできません。正規表現を使用してHTML / XMLを解析しようとするたびに、邪悪な子供たちが処女の血を流し、ロシアのハッカーがWebアプリケーションを支配します。正規表現で解析すると、汚染された魂が生きている世界に召喚されます。これは、愛、結婚、幼児殺害の儀式と同様に、正規表現と密接に関連しています。 <center>は受け入れられません。遅すぎました。同じ概念空間では、正規表現とHTML / XMLの力はパテのように心を破壊します。正規表現で分析すると、正規表現とその不愉快な方法に屈することになり、私たち全員が基本的な多言語の平面で名前を表現できない人のために非人間的な手間をするようになります。ここに彼が来ます。 HTMLと正規表現を一緒に使用すると、見る人の神経が和らげ、恐怖の猛攻撃で精神が枯れます。 Reg̿̔̉xベースのHTML/XMLパーサーはStackOverflowを殺したアームです遅すぎる、遅すぎる、私たちは救われない子を送信すると、正規表現はすべての生きている組織を消費します(以前に予測したようにHTMLを除く)。愛する主、この災害で生き残る方法を助けてくださいHTMLを解析するために正規表現を使用すると、人類は恐ろしいアドバイザーとセキュリティ違反の永遠の運命に直面します。レッジの使用xはHTML処理のためのツールとしてbreaを構築します。この世界間のchcΒΪoΗ割り込みエンティティ(SGMLエンティティと同じですが、もっと腐敗)ただ一目で世界のreg SEHTMLのexパーサーがinsを実行します。タントリー配送アプリプログラマ認識iエントまたは叫び続け、彼がやってくる、致命的で狡猾な正規表現感染が来ています私はあなたのHTを飲み込むMLパーサー、アプリケーションはVisual Basicのように常に存在していましたが、悪いです。その人が来る その人が来る英語許可されていませんe com̡e̡s, ̕h̵i​s un̨ho͞ly radiańcé deすべてのenli̶̍̈̂̈́制限、HTMLタグを分析します。leaΠki̧nΘgfr̠m̡yo͟君の目Ηs̸̛l̕ik͏e liqUID Pアイン、正規表現解析の曲はextiになります痛みの音spのタルマンここで私も見えて君も見えてヘペナオinal snuf男性のすべてはLOŚΖ̩͇̗̪̏̈TLL ISLOST彼は来た彼女はここに来たはいその無形遺産または浸透arマイパックE MY FACE ᵒh 神 nああいいえ、いいえθ停止tその̠̅s ͎a̧͈͖r̽̾̈́͒͑enティーO͇̹̺ͅ松̴ş̳ TH̘ㅠㅠ

答え3

これはsedと同じです。

$ cat file9
 <SubRecord1>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>Value i'm Concerned to Modify</Property>
 </SubRecord1>
 <SubRecord2>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>Do not Modify</Property>
 </SubRecord2>

$ sed -r '/\bSubRecord1\b/!b;n;n;n;s/(<Property Name=Default>)(.*)(<\/Property>)/\1AAAA\3/' file9
 <SubRecord1>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>AAAA</Property>
 </SubRecord1>
 <SubRecord2>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>Do not Modify</Property>
 </SubRecord2>

単語境界を使用すると、\bsedパターンが/SubRecord/一致SubRecord1しないSubRecord2

関連情報