如果我有一个awk命令
pattern { ... }
Run Code Online (Sandbox Code Playgroud)
和pattern使用捕获组,如何访问块中捕获的字符串?
gle*_*man 312
使用gawk,您可以使用该match函数捕获带括号的组.
gawk 'match($0, pattern, ary) {print ary[1]}'
Run Code Online (Sandbox Code Playgroud)
例:
echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}'
Run Code Online (Sandbox Code Playgroud)
输出cd.
请注意gawk的具体用法,它实现了相关功能.
对于便携式替代品,您可以使用match()和获得类似的结果substr.
例:
echo "abcdef" | awk 'match($0, /b[^e]*/) {print substr($0, RSTART+1, RLENGTH-1)}'
Run Code Online (Sandbox Code Playgroud)
输出cd.
Pet*_*ans 160
那是一段漫步的记忆之路......
很久以前我用perl替换了awk.
显然,AWK正则表达式引擎不捕获其组.
你可能会考虑使用类似的东西:
perl -n -e'/test(\d+)/ && print $1'
Run Code Online (Sandbox Code Playgroud)
-n标志使perl像awk一样遍历每一行.
ops*_*psb 30
这是我一直需要的东西所以我为它创建了一个bash函数.这是基于格伦杰克曼的回答.
将此添加到.bash_profile等.
function regex { gawk 'match($0,/'$1'/, ary) {print ary['${2:-'0'}']}'; }
Run Code Online (Sandbox Code Playgroud)
捕获文件中每一行的正则表达式
$ cat filename | regex '.*'
Run Code Online (Sandbox Code Playgroud)
捕获文件中每行的第一个正则表达式捕获组
$ cat filename | regex '(.*)' 1
Run Code Online (Sandbox Code Playgroud)
Dan*_*lis 14
你可以使用GNU awk:
$ cat hta
RewriteCond %{HTTP_HOST} !^www\.mysite\.net$
RewriteRule (.*) http://www.mysite.net/$1 [R=301,L]
$ gawk 'match($0, /.*(http.*?)\$/, m) { print m[1]; }' < hta
http://www.mysite.net/
Run Code Online (Sandbox Code Playgroud)
小智 6
您也可以在 vanilla awk 中模拟捕获,无需扩展。虽然它不直观:
步骤 1. 使用 gensub 用一些未出现在您的字符串中的字符包围匹配项。步骤 2. 对角色使用拆分。步骤 3. 拆分数组中的每个其他元素都是您的捕获组。
$ echo 'ab cb ad' | awk '{ split(gensub(/a./,SUBSEP"&"SUBSEP,"g",$0),cap,SUBSEP); 打印帽[2]"|" 帽[4] ; }'
ab|ad
| 归档时间: |
|
| 查看次数: |
151371 次 |
| 最近记录: |