<asd>blablabla</asd>
다음 을 포함하는 XML 파일이 있습니다.
<dsa>-some stuff
-other stuff
final stuff.</dsa>
"asd" 태그 사이의 모든 항목을 "dsa" 태그 사이의 항목으로 바꾸고 싶습니다. 이는 거의 100% 여러 줄입니다. 태그 자체를 바꾸는 것이 아니라 태그 사이의 텍스트만 바꾸고 줄 바꿈을 유지하고 싶습니다.
파일은 수시로 변경되며 이름, 확장자 및 태그는 동일하게 유지되며 그 사이의 내용만 변경됩니다.
기본적인 베어 bash(Github Actions에서 사용하는 종류)에서 이 작업을 수행할 수 있는 명령이 필요합니다.
생각하고 있는데 sed
여러 줄로 바꾸라고 어떻게 말해야 할지 모르겠습니다.
편집: 내 실수(아마도?)는 내 파일이 실제 XML 파일이 아닌 실제로 .net csproj 파일이었기 때문에 유사한 명령이 작동할지
확신할 수 없다는 것입니다 .xmlstarlet
답변1
올바른 형식의 XML 문서를 가정합니다.
<root>
<asd>blablabla</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</root>
다음과 같이 xmlstarlet
최상위 asd
노드의 내용을 해당 노드의 내용으로 간단히 바꿀 수 있습니다 .dsa
$ xmlstarlet ed -u '/root/asd' -x '/root/dsa/text()' file.xml
<?xml version="1.0"?>
<root>
<asd>-some stuff
-other stuff
final stuff.</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</root>
asd
각 노드를 형제 노드로 교체해야 하는 더 복잡한 예는 다음과 같습니다 dsa
.
<?xml version="1.0"?>
<root>
<node1>
<asd>blablabla</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</node1>
<node2>
<asd>REPLACE ME</asd>
<dsa>REPLACE WITH THIS</dsa>
</node2>
</root>
이는 다음을 통해 수행할 수 있습니다.
$ xmlstarlet ed -u '//asd' -x '../dsa/text()' file.xml
<?xml version="1.0"?>
<root>
<node1>
<asd>-some stuff
-other stuff
final stuff.</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</node1>
<node2>
<asd>REPLACE WITH THIS</asd>
<dsa>REPLACE WITH THIS</dsa>
</node2>
</root>
답변2
이 질문은 이전에 답변되었습니다.sed를 사용하여 여러 줄 문자열을 바꾸는 방법은 무엇입니까?
하지만 저는 해당 게시물의 두 번째 답변인 use 를 강력히 권장합니다 perl
. 많은 사람들이 PERL을 멀리할 수도 있지만 원래는 이와 같은 용도로 사용되었습니다.
$ perl -0777 -i.original -pe 's/a test\nPlease do not/not a test\nBe/igs' alpha.txt
보시다시피 패턴에는 줄 바꿈이 허용됩니다. 자세한 내용은 답변을 참조하세요.
답변3
xmlstarlet
그것이 옵션 이라면 - 어쩌면 이것을 겪을 수도 있습니다xmlstarlet GitHub 작업- 그럼 줘
$ cat file.xml
<?xml version="1.0"?>
<foo>
<asd>blablabla</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</foo>
당신은 다음과 같은 것을 할 수 있습니다
$ xmlstarlet edit --update '//asd' --value "$(xmlstarlet select -t -v '//dsa' file.xml)" file.xml
<?xml version="1.0"?>
<foo>
<asd>-some stuff
-other stuff
final stuff.</asd>
<dsa>-some stuff
-other stuff
final stuff.</dsa>
</foo>
인용하다:
답변4
좋습니다. XML 인식 파서를 사용해야 합니다. 하지만 Perl의 경우:
perl -0pe 'm!<dsa>(.*?)</dsa>!s and $a=$1;
s!<asd>.*?</asd>!<asd>$a</asd>!s' example