나는 running 에서 얻은 문자열을 가지고 있습니다 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