我想提取并打印字符串的两种模式
我的文件有数百行文本,但这里有两行。每行都有一个标记 F1、F2、F4、F4、F5、F6 和 F7,每个标记后面跟着 4 个字符。
F1A308F2A309 F3A310F4A311 F5A312F6A313F7A314
F1B308F2B309 F3B310F4B317 F5B312F6B313F7B315
我想提取模式“F2”后的 4 个字符和模式“F6”后的 4 个字符,以便输出为
A309 A314
B309 B313
为了进一步澄清,我只需要提取 F2 和 F4 之后的字符。
答案1
使用 Perl,对锚字符使用lookbehind:
$ perl -lne 'print join " ", /(?<=F2|F6)(.{4})/g' file
A309 A313
B309 B313
答案2
以下 awk 脚本是我认为您的要求的近似值:
{
for(i=1;i<=NF;i++) {
if (match($i, "F2....$") > 0) {
printf "%s ", substr($i, RSTART + 2, 4);
}
if (match($i, "F6....$") > 0) {
printf "% s", substr($i, RSTART + 2, 4);
}
}
print ""
}
它循环遍历每一行,然后循环遍历该行的每个字段。对于每个元素,如果元素的尾部有“F2”后跟 4 个字符,则打印这 4 个字符,后跟一个空格。完成一行循环后,打印回车符。
根据您的输入,输出为:
A309 A314
B309 B315
awk 脚本的更新版本,为了处理其字段中任何位置存在的元素,只需要$
删除锚定:
{
for(i=1;i<=NF;i++) {
if (match($i, "F2....") > 0) {
printf "%s ", substr($i, RSTART + 2, 4);
}
if (match($i, "F6....") > 0) {
printf "% s", substr($i, RSTART + 2, 4);
}
}
print ""
}
答案3
这个怎么样:
echo 'str' | egrep -o '(F2|F6)....' | egrep -o '....$' | xargs -n2