다음 스키마가 포함된 xml 파일(예: input.xml)이 있습니다.
<?xml version="1.0"?>
<TagA>
<TagB>
<File Folder="FOLDER1M\1" File="R1.txt" />
</TagB>
<TagB>
<File Folder="FOLDER1M\2" File="R2.txt" />
</TagB>
<TagB>
<File Folder="FOLDER2M\1" File="R3.txt" />
</TagB>
</TagA>
이 파일을 구문 분석하고 출력을 다른 파일에 써야 합니다. 원하는 출력은 다음 형식이어야 합니다.
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt
내가 지금까지 얻은 것은 다음과 같습니다
echo 'cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]' | xmllint --shell input.xml | grep '=' > xml_parsed
이것은 나에게 다음과 같은 형식의 o/p를 제공합니다.
/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"
현재 출력 대신 원하는 출력을 얻으려면 어떻게 해야 합니까?
답변1
이것은 한 가지 방법입니다. 더 쉽게 테스트할 수 있도록 출력을 example.txt라는 파일에 넣었습니다. echo 명령 끝에 내 명령을 추가하면 됩니다.
샘플.txt
Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"
주문하다
% cat sample.txt | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'
명령 분해
2줄씩 모두 합치기
# sed 'h;s/.*//;G;N;s/\n//g'
Folder="FOLDER1M\1"File="R1.txt"
Folder="FOLDER1M\2"File="R2.txt"
Folder="FOLDER2M\3"File="R3.txt"
폴더 삭제 = & "
# sed 's/Folder=\|"//g'
FOLDER1M\1File=R1.txt
FOLDER1M\2File=R2.txt
FOLDER2M\3File=R3.txt
File=을 '\'로 바꾸세요.
# sed 's/File=/\\/'
FOLDER1M\1\R1.txt
FOLDER1M\2\R2.txt
FOLDER2M\3\R3.txt
www.xyz.com을 삽입하세요.
# sed 's/^/www.xyz.com\\/'
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\3\R3.txt
편집 #1
OP는 출력의 첫 번째 줄을 제거하기 위해 내 답변을 수정하는 방법을 묻는 질문을 업데이트했습니다. 예를 들면 다음과 같습니다.
/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
...
...
나는 이것을 사용하여 grep -v ...
다음과 같이 관련 없는 행을 필터링할 수 있다고 그에게 말했습니다.
% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'
또는 전체 비트를 파일에 쓰려면 다음과 같이 수행할 수 있습니다.
% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/' > /path/to/some/file.txt
답변2
xmllint
이를 위해 사용하는 것은 어려울 것입니다.
사용 xmlstarlet
:
xmlstarlet sel -t \
-m '//TagB/File' \
-v 'concat("www.xyz.com", "\", @Folder, "\", @File)' \
-nl file.xml
또는 명령줄에 웹사이트 주소를 안전하게 제공하려면,
thesite=www.xyz.com
xmlstarlet sel -t --var site="'$thesite'" \
-m '//TagB/File' \
-v 'concat($site, "\", @Folder, "\", @File)' \
-nl file.xml
TagB/File
먼저 문서의 모든 노드 집합을 선택한 다음 각 노드에 대해 문자열을 www.xyz.com
속성 값 Folder
및 속성 값 File
( \
사이에 구분 기호 포함)과 연결합니다. 이로 인해 -nl
연결된 값 뒤에 개행 문자가 표시됩니다.
문제의 XML 문서의 출력을 제공합니다.
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt