次のテキストファイルがあります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_name
。sed
これにより、置換コマンドを編集式に挿入すると、そのコマンドの構文が破損しますsed
。
xmlstarlet
ドキュメントルートノードのプロパティをファイルの内容で更新し、各改行文字をスペースに置き換えるために使用されます。name
Project
branch.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.txt
inを使用します。paste
このユーティリティは対応するxmlstarlet
サブコマンドによって呼び出されます。ed
このコマンド編集するXML ファイルであり、その属性に一致する XPath クエリを介して特定の要素を更新することを指定します。
name
deploy_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
-L
ed
edit
<?xml ...>
--omit-decl
-O