如何使用通配符打印两种模式之间的文本?

如何使用通配符打印两种模式之间的文本?

我需要捕获两个模式之间的文本,但这些模式可能包含变化的数字。另外,我只关心具有该结构的以该字母序列开头的行,任何其他序列或结构都应被忽略。它们可以是我要捕获的左侧的两位数,但右侧的位数将保持不变

前任:

ab-cd-1.1.1.11-CAPTURE-11111111.xyz

或者

ab-cd-22.1.11.1-CAPTURE-11111112.xyz

如果我假设数字不会改变,但不确定如何考虑随机数,使用下面的命令我可以得到我需要的东西。任何帮助,将不胜感激。

echo "ab-cd-1.1.1.11-CAPTURE-11111111.xyz" | sed "s/.*ab-cd-1.1.1.11-//;s/-.*//"

答案1

您可以尝试awk使用 using-来分隔令牌:

awk -F\- '{print $4}' input_file

如果您想应用其他过滤器,这是一种可能的方法:

<exec some filter based on other fields> input_file|awk -F\- '{print $4}'

根据您编辑的答案,如果您希望字符串以ab-cd脚本开头,则为

awk -F\- '$1=="ab" && $2=="cd" {print $4}' input_file

根据最后的要求,这是脚本:

awk -F\- '$1=="ab" && $2=="cd" {split($5,a,"."); if (int(a[1])==a[1] && length(a[1])==8) print $4}' input_file

我的测试文件:

cat qq
ab-cd-1.1.1.11-CAPTURE-11111111.xyz
ab-cd-1.1.1.11-CAPTURa-1111111a.xyz
ab-cd-1.1.1.11-CAPTURb-1111111.xyz
ab-cd-1.1.1.11-aAPTURE-a1111112.xyz


awk -F\- '$1=="ab" && $2=="cd" {split($5,a,"."); if (int(a[1])==a[1] && length(a[1])==8) print $4}' qq
CAPTURE

答案2

每当有什么东西需要找出来时,我都会 grep从工具箱里拿出来。

$ grep -oP '\d+(?:\.\d+)+-\K[^-]+(?=-\d+)' file

相关内容