xmlファイルの値を、変数に「」が欠落しているsed値に置き換えます。

xmlファイルの値を、変数に「」が欠落しているsed値に置き換えます。

こんにちは。誰でも助けることができますか? Tomcat server.xmlファイルの値を変更しようとしています。ユーザー名sed コマンドの使用

<Resource username="user1" password="xxxxxxxx"/>

以下のコマンドは期待どおりに値を変更しますが、変数Uから値を取得するため、値の周りに ""はありません。

export U="userx"
sed -i -E  's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g' server.xml

userxの周りに「」出力がありません。 <Resource username=userx password="xxxxxxxx"/>

変数の代わりに値を使用すると、 ""でも機能します。

sed -i -E  's/(username=)([a-zA-Z0-9"-])+/\1"userx"/g' server.xml

ouput: <Resource username="userx" password="xxxxxxxx"/>

答え1

XMLを編集するとsed失敗しやすいです。代わりにXML編集ツールを使用してください。xmlstarletたとえば、

U='userx'
xmlstarlet edit --inplace --update '//Resource/@username' --value "$U" server.xml

--inplace個人的には、私は選択肢が動作するかどうかをテストするまで、選択肢を使用しません。

xmlstarletこれは通常、ディストリビューションのパッケージマネージャで使用できます。持っておらず、インストールする権限がない場合は、変更掲示板にインストール要求を送信してください。正しい作業に適したツールを使用することです。


sedしかし、コマンドが機能しないのは、含めたい二重引用符を見ることができないからです。以下は、いくつかの説明を含む元のコマンドです。

sed -E 's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g'
       ^single quotes start             ^single quotes end
                                         ^double quotes start
                                            ^double quotes end

シェルは引用符を使用して、文字列がどのように解析されるか(または解析されないか)識別します。一重引用符は文字通りの文字シーケンスを提供します。二重引用符はほとんどの文字を保護しますが、特に変数の評価を許可します。コマンド(sedこの場合)では、外部引用符は表示されません。したがって、文字列に二重引用符を含めるには、二重引用符を引用する必要があります。

読みやすくするためしかし、文法的な正確さは高くありません。修正された単一式を引用符で除算しました。

sed -E 's/(username=")([a-zA-Z0-9-])+/\1' "$U" '"/g'
       ^literal text used as an RE
                                          ^variable (quoted to protect it from the shell)
                                               ^more literal text

sed単一の式文字列を見ることができるようにもう一度合わせると、

sed -E 's/(username=")([a-zA-Z0-9-])+/\1'"$U"'"/g'

関連情報