XML属性にファイルの内容を挿入する

XML属性にファイルの内容を挿入する

次のテキストファイルがありますbranch.txt

$ cat branch.txt
DEMAND_NAME-CR-1234
DEMAND_NAME-CR-8970

上記のブランチ名を使用して、次のコマンドを使用していくつかの値を見つけて変更する必要がありますsed

branch_name=`(cat /tmp/branch.txt)`
sed -i "s/deploy_branch/$branch_name/g" /tmp/input.file

コマンドを実行すると、sed次のエラーが発生します。

sed: -e expression #1, char 35: unterminated `s' command

予想出力:

<Project description="first-deployment" name="DEMAND_NAME-CR-1234 DEMAND_NAME-CR-8970 " overwrite="true" type="Repository">
      </Project>

入力ファイル:

<Project description="first-deployment" name="deploy_branch" overwrite="true" type="Repository">
      </Project>

ベストアンサー1

コマンドの問題は、改行が含まれていることsedです$branch_namesedこれにより、置換コマンドを編集式に挿入すると、そのコマンドの構文が破損しますsed


xmlstarletドキュメントルートノードのプロパティをファイルの内容で更新し、各改行文字をスペースに置き換えるために使用されます。nameProjectbranch.txt

xmlstarlet edit \
    --update '/Project/@name' \
    --value "$(paste -s -d ' ' branch.txt)" input.file

またはより短く、

xmlstarlet ed \
    -u '/Project/@name' \
    -v "$(paste -s -d ' ' branch.txt)" input.file

pasteコマンド置換のコマンドはファイルを読み取り、branch.txt最後の文字を除くすべての改行文字を空白文字に置き換えます。これにより、name属性の新しい値として使用される文字列が生成されます。最後の改行文字を保持し、それを末尾の空白に変換するには(予測出力に表示されます)、このコマンドの代わりにtr '\n' ' ' <branch.txtinを使用します。paste

このユーティリティは対応するxmlstarletサブコマンドによって呼び出されます。edこのコマンド編集するXML ファイルであり、その属性に一致する XPath クエリを介して特定の要素を更新することを指定します。

namedeploy_branchプロパティ値がXPathクエリを使用するか、/Project/@name[. = "deploy_branch"]代わりに使用される場合にのみ変更する必要がありますか/Project[@name = "deploy_branch"]/@name

上記のコマンドの出力は次のようになります。

<?xml version="1.0"?>
<Project description="first-deployment" name="DEMAND_NAME-CR-1234 DEMAND_NAME-CR-8970" overwrite="true" type="Repository">
      </Project>

xmlstarletツールの前後に()オプションを与えることで、ツールが所定の位置に編集されるようにすることができます。 ()を使用すると宣言の追加を避けることができます。--inplace-Lededit<?xml ...>--omit-decl-O

おすすめ記事