gawk中的正则表达式匹配多种方式

我有一些文本需要拆分以提取相关参数,而我的 [g]awk match 命令不起作用 - 我只是想了解为什么?!(我现在已经写了一个不太优雅的方法......)。

所以字符串是 blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header

我只想输出 msgcontent1= 的内容,也是

echo "blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header" | gawk '{ if (match($0,/msgcontent1=(.*)[|]/,a)) { print a[1]; } }'

麻烦而不是得到
HeaderUUIiewConsenFlagPSMessage

我得到了从那里到字符串的最后一个管道的所有内容的匹配HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002
现在我接受这是因为 regexp/msgcontent1=(.*)[|]/可以匹配多种方式,但是我如何让它按照我想要的方式匹配?

回答

使用您显示的样本,请尝试以下操作。在 GNU 中编写和测试,awk这将只打印从第一次出现msgcontent1=|第一次出现的内容。

awk 'match($0,/msgcontent1=[^|]*/){print substr($0,RSTART+12,RLENGTH-12)}' Input_file

echo+awk尝试:

echo "blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header" |
awk 'match($0,/msgcontent1=[^|]*/){print substr($0,RSTART+12,RLENGTH-12)}'


FPAT在 GNU 中有选项awk

awk -v FPAT='msgcontent1=[^|]*' '{sub(/.*=/,"",$1);print $1}' Input_file


回答

这是您的输入:

s='blahblah|msgcontent1=HeaderUUIiewConsenFlagPSMessage|msgtype2=Blah002|msgcontent2=header'

您可以gnu awk像这样使用以下方法提取值msgcontent1=

awk -F= -v RS='|' '$1 == "msgcontent1" {print $2}' <<< "$s"

HeaderUUIiewConsenFlagPSMessage

或使用这个sed

sed -E 's/^(.*|)?msgcontent1=([^|]+).*/2/' <<< "$s"

HeaderUUIiewConsenFlagPSMessage

或者使用这个gnu grep

grep -oP '(^||)msgcontent1=K[^|]+' <<< "$s"

HeaderUUIiewConsenFlagPSMessage


以上是gawk中的正则表达式匹配多种方式的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>