작은따옴표로 묶인 문자열 가져오기

작은따옴표로 묶인 문자열 가져오기
<source file='/home/anpham/Projects/vm-builder/30G'/>

위 출력에서 ​​절대 경로를 추출하기 위해 sed 명령을 사용해 보았지만 출력에서 ​​문자열이 잘리지 않습니다. 다음 명령은 나의 시도입니다.

virsh dumpxml --domain "test1" | grep 'source file' | head -1 | sed '/^<source$/d' 

출력은 여전히 ​​다음과 같습니다.

<source file='/home/anpham/Projects/vm-builder/30G'/>

답변1

fileXML 문서에 있는 모든 노드의 모든 속성 값을 추출하려면 다음을 사용할 수 있습니다.sourcexmlstarlet

xmlstarlet sel -t -v '//source/@file' -nl file.xml

또는 다음 virsh명령을 읽으십시오.

virsh dumpxml --domain "test1" | xmlstarlet sel -t -v '//source/@file' -nl

파이프라인의 문제는 최종 명령이 정확한 문자열(다른 문자열 제외)을 포함하는 모든 줄을 sed제거하려고 한다는 것입니다. <source귀하의 입력에는 그러한 줄이 없습니다 sed.

답변2

모든 UNIX 시스템의 모든 쉘에서 sed를 사용하십시오.

$ sed "s/.*<source file='\([^']*\).*/\1/" file
/home/anpham/Projects/vm-builder/30G

답변3

우선, sed 명령은 단어만 포함하는 줄을 제외하고는 어떤 것과도 일치하지 않습니다 source. 이는 ^단어 앞에 (줄 시작)을 넣고 $단어 뒤에 (줄 끝)을 넣기 때문입니다 source. 둘째: grep이나 head 없이도 가능합니다.

virsh dumpxml --domain "test1" | sed -ne 's/\s*<source file=.\([^\/].*\).\/>.*/\1/; t end; b; :end; p; Q'

관련 정보