로그에서 단어 사이를 이동하는 방법은 무엇입니까?

로그에서 단어 사이를 이동하는 방법은 무엇입니까?

아래와 같은 줄이 포함된 txt 파일이 있습니다.

다음으로 시작하세요:

 Parameters: {"raw_message"=>"MSH.......

다음으로 끝납니다:

</HL7Message>"}

각 줄의 중간에 나타나는 원본과 변환 사이의 단어를 grep하여 파일로 출력하고 싶습니다.

파일은 다음과 같습니다

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

최선의 시나리오

>MSH 이후에 MSH가 출력되기 시작하는데 각 줄마다 MSH의 인스턴스가 많이 있습니다. 그래서 메시지 사이를 파악한 다음 원본 부분과 변환된 부분을 추출하는 것이 논리적일 수 있다고 생각했습니다.

raw_message"=>"MSH......preceding words followed by transformed

변환된 LAB\r", "변환됨 00355", "변환됨

그래서 내가 원해

MSH....LAB\r
MSH....00355

어떤 도움이라도 대단히 감사하겠습니다!

나는 시도했다:

sed -n "/<raw>/,/<\/transformed>/p" HL7prod.txt > HL7prod2.txt

예시 라인

 Parameters: {"raw_message"=>"MSH|^~\\&||CDFGTL|||20144543000||ATG^A05|TLGTADM.1.13773085|P|2.1\rEVN|A08|11111111111|||MDFGQ8833^HLPS^GEGES^^^^\rPID|1||K11111111|K1111111|HOLVBVFS^LGDSA^^^^||19GHYSSD|F|^^^^^||^^^^^^^^|||||||K01045435547691\rPV1|1|P|K.ER^^||||LKIJK^Liujn^Jeggrs^H^^^MD|||ER||||||N||ER|||||||||||||||||||||DFLHL|ABD DFIN|PRE|||111111111||||||||\rZCS||^^^^||||00355", "transformed_data"=>"<HL7Message><MSH><MSH.1>|</MSH.1><MSH.2>^~\\&amp;</MSH.2><MSH.3><MSH.3.1>CDFLH</MSH.3.1></MSH.3><MSH.4><MSH.4.1>COCTL</MSH.4.1></MSH.4><MSH.5/><MSH.6/><MSH.7><MSH.7.1>201506331000</MSH.7.1></MSH.7><MSH.8/><MSH.9><MSH.9.1>ADT</MSH.9.1><MSH.9.2>A08</MSH.9.2></MSH.9><MSH.10><MSH.10.1>TLGGBGM.1.13773076</MSH.10.1></MSH.10><MSH.11><MSH.11.1>P</MSH.11.1></MSH.11><MSH.12><MSH.12.1>2.1</MSH.12.1></MSH.12></MSH><EVN><EVN.1><EVN.1.1>A08</EVN.1.1></EVN.1><EVN.2><EVN.2.1>201506125500</EVN.2.1></EVN.2><EVN.3/><EVN.4/><EVN.5><EVN.5.1>MDHYQ6633</EVN.5.1><EVN.5.2>LUJKL</EVN.5.2><EVN.5.3>JYTEDFG</EVN.5.3><EVN.5.4/><EVN.5.5/><EVN.5.6/><EVN.5.7/></EVN.5></EVN><PID><PID.1><PID.1.1>1</PID.1.1></PID.1><PID.2/><PID.3><PID.3.1>K0567432372</PID.3.1></PID.3><PID.4><PID.4.1>K5894336</PID.4.1></PID.4><PID.5><PID.5.1>HOLDFGEER</PID.5.1><PID.5.2>AAAAS</PID.5.2><PID.5.3/><PID.5.4/><PID.5.5/><PID.5.6/></PID.5><PID.6/><PID.7><PID.7.1>1111111111</PID.7.1></PID.7><PID.8><PID.8.1>F</PID.8.1></PID.8><PID.9><PID.9.1/><PID.9.2/><PID.9.3/><PID.9.4/><PID.9.5/><PID.9.6/></PID.9><PID.10/><PID.11><PID.11.1/><PID.11.2/><PID.11.3/><PID.11.4/><PID.11.5/><PID.11.6/><PID.11.7/><PID.11.8/><PID.11.9/></PID.11><PID.12/><PID.13><PID.13.1/></PID.13><PID.14/><PID.15/><PID.16/><PID.17/><PID.18><PID.18.1>K0101333333333</PID.18.1></PID.18></PID><PV1><PV1.1><PV1.1.1>1</PV1.1.1></PV1.1><PV1.2><PV1.2.1>P</PV1.2.1></PV1.2><PV1.3><PV1.3.1>K.ER</PV1.3.1><PV1.3.2/><PV1.3.3/></PV1.3><PV1.4/><PV1.5/><PV1.6/><PV1.7><PV1.7.1>JTOLOKS</PV1.7.1><PV1.7.2>Ldasfs</PV1.7.2><PV1.7.3>Jtuygikd</PV1.7.3><PV1.7.4>H</PV1.7.4><PV1.7.5/><PV1.7.6/><PV1.7.7>MD</PV1.7.7></PV1.7><PV1.8/><PV1.9/><PV1.10><PV1.10.1>ER</PV1.10.1></PV1.10><PV1.11/><PV1.12/><PV1.13/><PV1.14/><PV1.15/><PV1.16><PV1.16.1>N</PV1.16.1></PV1.16><PV1.17/><PV1.18><PV1.18.1>ER</PV1.18.1></PV1.18><PV1.19/><PV1.20/><PV1.21/><PV1.22/><PV1.23/><PV1.24/><PV1.25/><PV1.26/><PV1.27/><PV1.28/><PV1.29/><PV1.30/><PV1.31/><PV1.32/><PV1.33/><PV1.34/><PV1.35/><PV1.36/><PV1.37/><PV1.38/><PV1.39><PV1.39.1>COTOLA</PV1.39.1></PV1.39><PV1.40><PV1.40.1>ABD XXXX</PV1.40.1></PV1.40><PV1.41><PV1.41.1>PRE</PV1.41.1></PV1.41><PV1.42/><PV1.43/><PV1.44><PV1.44.1>111111111</PV1.44.1></PV1.44><PV1.45/><PV1.46/><PV1.47/><PV1.48/><PV1.49/><PV1.50/><PV1.51/><PV1.52/></PV1><ZCS><ZCS.1/><ZCS.2><ZCS.2.1/><ZCS.2.2/><ZCS.2.3/><ZCS.2.4/><ZCS.2.5/></ZCS.2><ZCS.3/><ZCS.4/><ZCS.5/><ZCS.6><ZCS.6.1>111111</ZCS.6.1></ZCS.6></ZCS><GT1><GT1.6><GT1.6.1/></GT1.6></GT1><ZRF><ZRF.1><ZRF.1.1>COTYUL</ZRF.1.1></ZRF.1><ZRF.2><ZRF.2.1>CDFTL</ZRF.2.1><ZRF.2.2>K.ER</ZRF.2.2></ZRF.2></ZRF></HL7Message>"}

고 싶어요:

MSH|^~\\&||CDFGTL|||20144543000||ATG^A05|TLGTADM.1.13773085|P|2.1\rEVN|A08|11111111111|||MDFGQ8833^HLPS^GEGES^^^^\rPID|1||K11111111|K1111111|HOLVBVFS^LGDSA^^^^||19GHYSSD|F|^^^^^||^^^^^^^^|||||||K01045435547691\rPV1|1|P|K.ER^^||||LKIJK^Liujn^Jeggrs^H^^^MD|||ER||||||N||ER|||||||||||||||||||||DFLHL|ABD DFIN|PRE|||25679506645657||||||||\rZCS||^^^^||||00355

답변1

패턴의 각 줄 사이에만 텍스트가 필요한 경우 다음을 수행하십시오.

sed 's/.*raw\(.*\)transformed.*/\1/'

\(.*\) 기억하다출력 텍스트를 사용하십시오 \1. 라인의 다른 것들은 출력되지 않습니다.

답변2

PCRE를 지원하는 grep이 있는 경우 다음을 수행할 수 있습니다.

$ grep -oP 'Parameters: {"raw_message"=>"\K.+?(?=", "transformed_data")' file

또는 파일이 원하는 것과 같으면 다음과 같이 단순화하세요.

$ grep -oP '=>"\K.+?(?=",)' file

또는 를 사용하여 awk필드 구분 기호를 =>또는 a 로 설정 ,하고 두 번째 필드를 인쇄합니다(이 역시 와 일치하며 "`를 "통해 파이핑하여 tr -d제거합니다).

$ awk -F'[,>]' '{print $2}' file

또는 MSH로 시작하는 첫 번째 인용 문자열을 grep할 수도 있습니다.

$ grep -Po '"MSH.+?"' file

또한 따옴표를 피하십시오.

$ grep -Po '"\KMSH.*?(?=")' file

답변3

네 안의 따옴표예시 라인상당히 중요한 것 같습니다. 해당 문자열에서 이스케이프된 따옴표를 사용할 수 없는 경우 수행해야 할 작업은 다음과 같습니다.

cut -d\" -f4 <in >out

"큰따옴표 구분 기호로 구분된 행의 네 번째 필드를 가져옵니다 .

해당 문자열에서 큰따옴표를 이스케이프할 수 있는 경우(예: 백슬래시를 통해) 다음을 수행할 수 있습니다.

sed 's/[^>]*."//;s/", ".*//' 

...아무 것도 건너뛰거나 오탐 없이 원하는 필드만 안전하게 가져오세요. 이것이 유일한 따옴표 문자인 경우 위의 두 대체 문자가 이를 잘 처리해야 합니다.(백슬래시는 계산되지 않습니다)당신은 그것을 사용할 수 있고 모든 비트가 raw이와 같이 시작 하고 >그 이전에는 아무 일도 >일어나지 않는다고 가정할 수 있습니다.

관련 정보