与えられた

与えられた

sedコマンドを使用して、次のノードの値を変更しようとします。

<KeyValue key="EMPTY_SEARCH_CRITERIA" type="String" value="CS_CODE" comment="Configured empty search criteria."/>

初期値には任意の文字列値を含めることができるので、ワイルドカードを使用します。例えば。

sed -e 's/value=.*/value="SN_CODE,CS_ID" comment="Configured empty search criteria."\/\>/g' CMS_conf.xml > tempfile
         ^        ^                                                                     ^

ただし、この場合は comment 属性も含める必要があります。

コメント属性を入力せずにこれを行う方法はありますか?

答え1

私は正規表現のPerl方言を使います。お使いのシステムで利用可能な場合は、sedPerlを使用している可能性が高くなります。

与えられた

<KeyValue key="EMPTY_SEARCH_CRITERIA" type="String" value="CS_CODE" comment="Configured empty search criteria."/>

パール正規表現

perl -i -pe 's/(value=)".*?"/\1"some_replacement_string"/g' <filename>

ノート

まず、端末に印刷してテストしてみることもできます。

perl -pe 's/(value=)".*?"/\1"some_replacement_string"/g' <filename>

または、拡張子を使用してバックアップを作成してください。.bak

perl -i.bak -pe 's/(value=)".*?"/\1"some_replacement_string"/g' <filename>

正規表現の説明:

  • (): 変数にグループ化\1
  • ":一重引用符であるため、引用符は文字通りと見なされるため、エスケープする必要はありません。
  • ?:飼いならす*の場合、最初のマッチで噛むのをやめます(最後のマッチまで噛み続けません)。sed貪欲ではない演算子はサポートされていませんが、他の回答でトリックを使用できます[^"]*"。これはすべて飲み込むことを意味します。この場合、実際に同じことを行う文字です。

答え2

CS_CODEをSN_CODE、CS_IDに具体的に変更するには、次のものを使用できます。

's/CS_CODE/SN_CODE,CS_ID/g'

値が異なる場合に使用できます

's/value=\S*\S/value="SN_CODE,CS_ID"/g'

答え3

sedHTML(または他のプログラミング言語)処理のための最良の選択ではありませんが、とにかく:

sed -e 's/\(value\)="[^"]*"/\1="SN_CODE,CS_ID"/'

明確ではないかもしれない2つのことがあります。

  • 後で使用できるようにパターンをグループ\(化します。\)\1
  • [^"]*以下を除くすべての文字と一致するために使用されます。"

関連情報