在 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

相关内容