Bashで角かっこ内のいくつかのテキストを置き換える

Bashで角かっこ内のいくつかのテキストを置き換える

私はランニングから得た文字列を持っていますjack_lsp

a2j:Arturia BeatStep [28] (capture): Arturia BeatStep MIDI 1

xmlファイルには、以前のjackセッションの接続状態が保存されました。

<connection>
    <output>a2j:Arturia BeatStep [20] (capture): Arturia BeatStep MIDI 1</output>
    <input>starmaze:midi_to_slave_1</input>
</connection>

[]以前のセッション(xmlファイルに保存されている)と現在のセッションの間に(括弧)内の値が変更されたことがわかります。 asu このようにファイルをロードしようとするたびにファイルの値を更新しようとします。

これを行うには、次のbashスニペットがあります。

ARTURIA_CHAN=$( jack_lsp | grep Arturia | grep capture | sed -e 's/^.*\[\(.*\)\].*$/\1/' )
ARTURIA_XMLCHAN=$( cat "${ofname}" | grep Arturia | grep capture | sed -e 's/^.*\[\(.*\)\].*$/\1/' )
if [ "${ARTURIA_CHAN}" != "${ARTURIA_XMLCHAN}" ]; then
   sed -e "s/\[$ARTURIA_XMLCHAN\]/\[$ARTURIA_CHAN\]/g" -i.bak1-art "${ofname}"
   echo "changing arturia from ${ARTURIA_XMLCHAN} to ${ARTURIA_CHAN}"
fi

ofnameデフォルトでは、xmlファイルである「出力ファイル名」です。

両方の変数は期待値(その内容[])を取得しているように見えますが、sed操作が正しく機能しないか、ファイルが保存されていません。しかし、それが本当かどうかはわかりません。たぶんそれはあなたにもっと明白でしょうか?

ありがとうございます。

答え1

XMLパーサーのより良い使用XパスXML ファイルを変更する式です。一例:

$ xmlstarlet edit -L -u "/connection/output[contains(., "Arturia")]" -v "remplacement_string" file.xml

関連情報