Bash에서 대괄호 안의 일부 텍스트 바꾸기

Bash에서 대괄호 안의 일부 텍스트 바꾸기

나는 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 edit -L -u "/connection/output[contains(., "Arturia")]" -v "remplacement_string" file.xml

관련 정보