![在 bash 中替换方括号中的一些文本](https://linux22.com/image/60253/%E5%9C%A8%20bash%20%E4%B8%AD%E6%9B%BF%E6%8D%A2%E6%96%B9%E6%8B%AC%E5%8F%B7%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E6%96%87%E6%9C%AC.png)
我有一个从运行中得到的字符串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:
$ xmlstarlet edit -L -u "/connection/output[contains(., "Arturia")]" -v "remplacement_string" file.xml