sed를 사용하여 XML 노드의 값을 변경하시겠습니까?

sed를 사용하여 XML 노드의 값을 변경하시겠습니까?

XML 문서에 다음 노드가 있습니다.

<client-version>1.2.8</client-version>

노드의 값을 1.2.8로 바꾸는 방법은 무엇입니까 1.2.9?

원하는 출력:

<client-version>1.2.9</client-version>

답변1

이를 수행하려면 XML 파서를 사용할 수 있습니다. 예 xmlstarlet(명령줄 XML 도구):

$ xmlstarlet ed -u '//client-version' -v '1.2.9' file.xml
<?xml version="1.0"?>
<client-version>1.2.9</client-version>

위의 명령은 다음을 찾습니다.모두문서 노드의 발생 횟수 client-version이며 해당 값을 문자열로 변경합니다 1.2.9.

1.2.8사용할 수 있는 항목만 변경하려면

xmlstarlet ed -u '//client-version[text() = "1.2.8"]' -v '1.2.9' file.xml

출력을 새 파일로 리디렉션하고 검사한 후 원래 파일 이름으로 이름을 바꾸거나 또는 옵션을 xmlstarlet사용하여 실행하여 파일을 제자리에서 편집합니다.-L--inplace


사용하다 xq, 에서 온다 yq, 에서 온다https://kislyuk.github.io/yq/jq, 표현식을 사용하여 XML 문서를 수정할 수 있습니다 .

xq -x '(..|."client-version"? // empty) |= "1.2.9"' file.xml

client-version1.2.9이렇게 하면 문서의 위치에 상관없이 각 노드의 값이 업데이트됩니다 .

1.2.9다음과 같이 변수에서 문자열을 삽입할 수 있습니다.

new_version=1.2.9
xq -x --arg ver "$new_version" '(..|."client-version"? // empty) |= $ver' file.xml

답변2

아래 awk 명령을 사용해 보십시오. 훌륭하게 작동합니다.

awk '$0 ~ /^<client-version>/ && $0 ~ /<\/client-version>/{gsub("1.2.8","1.2.9",$0)}1' orginalfile  >temperorayfile && mv temperorayfile  orginalfile 

관련 정보