こんにちは。誰でも助けることができますか? 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'