假设您的字段是空格分隔的,然后使用 GNU awk for gensub():
$ cat file
a b c d e f
g h i j k l
$ awk '{print gensub(/(\S\s){2}/,"",1)}' file
c d e f
i j k l
如果使用 GNU awk 再次使用 gensub() 从字段 3 到字段 5 进行空白分隔,则通常从字段 3 打印到字段 5:
$ awk '{print gensub(/(\S\s){2}((\S\s){2}\S).*/,"\\2",1)}' file
c d e
i j k
或匹配的第三个参数():
$ awk 'match($0,/(\S\s){2}((\S\s){2}\S)/,a){print a[2]}' file
c d e
i j k
或者一般来说,如果它们被任何单个字符分隔:
$ awk '{print gensub("([^"FS"]"FS"){2}(([^"FS"]"FS"){2}[^"FS"]).*","\\2",1)}' file
c d e
i j k
$ awk 'match($0,"([^"FS"]"FS"){2}(([^"FS"]"FS"){2}[^"FS"])",a){print a[2]}' file
c d e
i j k
如果字段由字符串而不是单个字符分隔,但 RS 是单个字符,那么您应该暂时将 FS 更改为 RS(根据定义,您知道它不能出现在记录中),这样您就可以在括号表达式中否定它:
$ cat file
aSOMESTRINGbSOMESTRINGcSOMESTRINGdSOMESTRINGeSOMESTRINGf
gSOMESTRINGhSOMESTRINGiSOMESTRINGjSOMESTRINGkSOMESTRINGl
$ awk -F'SOMESTRING' '{gsub(FS,RS)} match($0,"([^"RS"]"RS"){2}(([^"RS"]"RS"){2}[^"RS"])",a){gsub(RS,FS,a[2]); print a[2]}' file
cSOMESTRINGdSOMESTRINGe
iSOMESTRINGjSOMESTRINGk
如果 FS 和 RS 都是多字符,那么有多种选择,但最简单的方法是使用 NUL 字符或您知道不能出现在输入文件中的其他字符,而不是 RS 作为临时替换 FS:
$ awk -F'SOMESTRING' '{gsub(FS,"\0")} match($0,/([^\0]\0){2}(([^\0]\0){2}[^\0])/,a){gsub("\0",FS,a[2]); print a[2]}' file
cSOMESTRINGdSOMESTRINGe
iSOMESTRINGjSOMESTRINGk
如果需要,显然可以在上面最后的 gsub() 中将 FS 更改为 OFS。
如果 FS 是一个正则表达式而不是一个字符串,并且您希望将其保留在输出中,那么您需要查看 GNU awk 以获取 split() 的第 4 个参数。