我有以下模式:
$ 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,我会这样做:
$ 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字段中呢?如下所示:
result = gensub(/([0-9]+),\\1>\\1/,"my replaced string", "g", string)我怎样才能做到这一点呢?
发布于 2020-11-19 06:55:17
Awk不支持正则表达式中的反向引用,因为这样做需要比awk使用的正则表达式引擎慢得多的正则表达式引擎(参见https://swtch.com/~rsc/regexp/regexp1.html),而且这是不必要的,也很少需要。这可能就是您想要做的,使用GNU awk for the This来匹配():
$ 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:
$ 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发布于 2020-11-19 06:08:36
这里有一个sed解决方案可以做到这一点。
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脚本。
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如果要验证第三个字段始终是数字,请执行以下操作。添加以下条件:
awk -F "[>,]" '$3 ~ "^[0-9]+$"{sub($3","$3">"$3,"Replaced string")}1'https://stackoverflow.com/questions/64901049
复制相似问题