首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWK:如何在gensub()函数的regex字段中有backreference \1?

AWK:如何在gensub()函数的regex字段中有backreference \1?
EN

Stack Overflow用户
提问于 2020-11-19 04:42:17
回答 2查看 377关注 0票数 0

我有以下模式:

代码语言:javascript
复制
$ echo -e "1>1>659,659>659>660\n1>1>683,683>683>684\n1>1>712,712>712>713\n1>1>1080648,1>1>1080660\n1>1>1081100,1>1>1081114"
1>1>659,659>659>660
1>1>683,683>683>684
1>1>712,712>712>713
1>1>1080648,1>1>1080660
1>1>1081100,1>1>1081114

我想替换在逗号和大于号(>)之间顺序出现相同数字的模式。因此,为了认同grep,我会这样做:

代码语言:javascript
复制
$ echo -e "1>1>659,659>659>660\n1>1>683,683>683>684\n1>1>712,712>712>713\n1>1>1080648,1>1>1080660\n1>1>1081100,1>1>1081114" |
grep -Eo "([0-9]+),\1>\1"

659,659>659
683,683>683
712,712>712

这是对同一组的两个反向引用。

我知道在awk中使用gensub()可以在替换字段中有反向引用。但是我怎么能把它放在regexp字段中呢?如下所示:

代码语言:javascript
复制
result = gensub(/([0-9]+),\\1>\\1/,"my replaced string", "g", string)

我怎样才能做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-19 06:55:17

Awk不支持正则表达式中的反向引用,因为这样做需要比awk使用的正则表达式引擎慢得多的正则表达式引擎(参见https://swtch.com/~rsc/regexp/regexp1.html),而且这是不必要的,也很少需要。这可能就是您想要做的,使用GNU awk for the This来匹配():

代码语言:javascript
复制
$ awk 'match($0,/([0-9]+),/,a){ sub(a[1]","a[1]">"a[1],"my replaced string") } 1' file
1>1>my replaced string>660
1>1>my replaced string>684
1>1>my replaced string>713
1>1>1080648,1>1>1080660
1>1>1081100,1>1>1081114

或者使用任何awk:

代码语言:javascript
复制
$ awk 'match($0,/([0-9]+),/){ a=substr($0,RSTART,RLENGTH-1); sub(a","a">"a,"my replaced string") } 1' file
1>1>my replaced string>660
1>1>my replaced string>684
1>1>my replaced string>713
1>1>1080648,1>1>1080660
1>1>1081100,1>1>1081114
票数 1
EN

Stack Overflow用户

发布于 2020-11-19 06:08:36

这里有一个sed解决方案可以做到这一点。

代码语言:javascript
复制
sed 's|\([0-9]\+\),\1>\1|Replaced string|g'

echo -e "1>1>659,659>659>660\n1>1>683,683>683>684\n1>1>712,712>712>713\n1>1>1080648,1>1>1080660\n1>1>1081100,1>1>1081114" | sed 's|\([0-9]\+\),\1>\1|Replaced string|g'
1>1>Replaced string>660
1>1>Replaced string>684
1>1>Replaced string>713
1>1>1080648,1>1>1080660
1>1>1081100,1>1>1081114

我希望你能用sed代替awk

但是如果awk是强制的,那么这里有一个笨拙的awk脚本。

代码语言:javascript
复制
awk -F "[>,]" '{sub($3","$3">"$3,"Replaced string")}1'

echo -e "1>1>659,659>659>660\n1>1>683,683>683>684\n1>1>712,712>712>713\n1>1>1080648,1>1>1080660\n1>1>1081100,1>1>1081114" | awk -F "[>,]" '{sub($3","$3">"$3,"Replaced string")}1'
1>1>Replaced string>660
1>1>Replaced string>684
1>1>Replaced string>713
1>1>1080648,1>1>1080660
1>1>1081100,1>1>1081114

如果要验证第三个字段始终是数字,请执行以下操作。添加以下条件:

代码语言:javascript
复制
awk -F "[>,]" '$3 ~ "^[0-9]+$"{sub($3","$3">"$3,"Replaced string")}1'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64901049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档