sed 내에서 bash 실행 시 큰따옴표를 유지하는 방법

sed 내에서 bash 실행 시 큰따옴표를 유지하는 방법

다음과 같은 줄이 많이 포함된 로그 파일이 있습니다.

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>

sedbash 명령 in 및 out을 실행할 때 구문에 몇 가지 트릭이 있다는 것을 알고 있지만 여러 가지 다른 구문(예: \1 주위의 "" 제거, , 대신 외부 사용 등) echo을 시도했지만 그중 아무것도 시도하지 않았습니다. 일했다.printfxargssed

저는 Ubuntu 배포판 18.04(Windows에서는 WSL 1)를 사용하고 있습니다.

echosed 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'

관련 정보