다음과 같은 줄이 많이 포함된 로그 파일이 있습니다.
2021/09/03-13:11:05;QUEUE.INBOUND;4;ID:myhost.mydomain.net-7756-1629822315072-199:973:1:1:1;MISC;"<?xml version="1.0" encoding="UTF-8"?> <RootElement xmlns="urn:namespace:entity/1" tstamp="2021-02-29T12:11:00Z" object="urn:domain:entity:ID1234"><Active lang="en" value="true">active</Active><Name lang="en">Some Name</Name><ShortName lang="en">shortname</ShortName><Phone number="+416458838829" lang="en">+416458838829</Phone><Email>[email protected]</Email><Longitude>7.043786</Longitude><Latitude>47.239036</Latitude></RootElement>"
(XML은 이보다 크지만 이는 단지 예시일 뿐입니다.)
내 목표는 각 줄의 각 XML을 전용 파일로 추출하는 것입니다. 로그에 10줄이 포함되어 있으면 10개의 파일이 생성됩니다.
이것이 내가 시작한 방법입니다.
more mylogfile.txt | sed -r 's!^.*\s(<RootElement.*\sobject="urn:domain:entity:([A-z0-9]*)"><Active.*</RootElement>).*!echo "\1" | xmlstarlet fo > "\2.xml"!e; d'
아이디어는 개체 항아리에서 ID를 추출하여 파일 이름으로 사용하는 것입니다(ID는 파일 내에서 고유합니다).
질문:
"echo" 명령만 실행하는 경우
more mylogfile.txt | sed -r 's!^.*\s(<RootElement.*\sobject="urn:domain:entity:([A-z0-9]*)"><Active.*</RootElement>).*!echo "\1"!e; d'
XML의 큰따옴표가 방금 지워지고 xmlstarlet
명령(첫 번째 시도에서)에서 오류가 발생하는 것을 확인했습니다.
활성 요소의 예는 다음과 같습니다.
<Active lang=en value=true>active</Active>
sed
bash 명령 in 및 out을 실행할 때 구문에 몇 가지 트릭이 있다는 것을 알고 있지만 여러 가지 다른 구문(예: \1 주위의 "" 제거, , 대신 외부 사용 등) echo
을 시도했지만 그중 아무것도 시도하지 않았습니다. 일했다.printf
xargs
sed
저는 Ubuntu 배포판 18.04(Windows에서는 WSL 1)를 사용하고 있습니다.
echo
sed
s!...!...!e
아니면 " " 명령에 이 문제를 개선할 수 있는 옵션이 있습니까 ?
(더 효율적인 방법을 찾으신다면 저도 그렇게 할게요)
답변1
먼저 이스케이프된 따옴표를 사용해야 합니다 s/"/\\"/g
. 이렇게 하면 먹을 수 없게 됩니다 echo
.
그런 다음 검색 패턴을 조정하는 것을 잊지 마십시오. \"
대신 일치해야 하고 백슬래시를 이스케이프해야 하므로 검색 패턴 "
에 있어야 합니다 .\\"
sed -E 's/"/\\"/g;s!^.*\s(<RootElement.*\sobject=\\"urn:domain:entity:([A-Za-z0-9]*)\\"><Active.*</RootElement>).*!echo "\1"!e;d'