我有一个 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 实例。所以我认为 grep 消息之间然后将原始部分和转换后的部分撕掉可能是合乎逻辑的。
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>^~\\&</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
,将字段分隔符设置为 an=>
或 a,
并打印第二个字段(这也与"
, 管道通过tr -d
"` 匹配以删除它们):
$ awk -F'[,>]' '{print $2}' file
或者,您可以只 grep 查找以 MSH 开头的第一个带引号的字符串:
$ grep -Po '"MSH.+?"' file
并且,避免引号:
$ grep -Po '"\KMSH.*?(?=")' file
答案3
你中的引号示例行似乎确实相当重要。如果该字符串中不可能出现转义引号,那么您所要做的就是:
cut -d\" -f4 <in >out
获取一行中的第四个字段,并用"
双引号分隔符分隔。
如果双引号可能会在该字符串中转义 - 例如通过反斜杠 - 那么你可以这样做:
sed 's/[^>]*."//;s/", ".*//'
...安全地只获取您想要的字段,而不会跳过任何内容,也不会出现误报。如果这些是唯一的引号字符,上面的两个替换应该可以很好地处理这个问题(不计算反斜杠)可以使用它,并且假设所有位都以raw
这样的方式开始>
并且在它之前没有>
任何地方发生。