当使用多个模式时,gawk gensub替换删除字符

时间:2017-04-21 21:21:16

标签: regex awk substring gawk

以下是按预期工作

echo -e "Abcd? Doi"| gawk '{print gensub(/([?]) ([A-Z])/, "_\\2", "G" ,$0)}'

-| Abcd_Doi

但是当我使用

echo -e "Abcd? Doi"|\
gawk '{print gensub(/([.]) ([A-Z])|([?]) ([A-Z])/, "_\\2", "G" ,$0)}'

我得到了

-| Abcd_oi

有趣的是,如果匹配的模式是' / ... | ... /'中的第一个模式。语法然后它按预期运行。

echo -e "Abcd? Doi"|\
gawk '{print gensub(/([?]) ([A-Z])|([.]) ([A-Z])/, "_\\2", "G" ,$0)}'

-| Abcd_Doi

很想知道,为什么gensub会将模式的位置处理为多个"或者#34;模式不同?任何人?

我正在使用

  

GNU Awk 4.1.4,API:1.1(GNU MPFR 3.1.5,GNU MP 6.1.2)

1 个答案:

答案 0 :(得分:1)

这是因为在你的第二个正则表达式中有4个被捕获的组,你需要在替换组中引用组#4:

echo "Abcd? Doi"|gawk '{print gensub(/([.]) ([A-Z])|([?]) ([A-Z])/, "_\\4", "G" ,$0)}'

Abcd_Doi

以下是正则表达式中的组号:

/([.]) ([A-Z])|([?]) ([A-Z])/
---1------2------3------4---

您实际上可以将两个正则表达式合并为一个并且只处理两个组:

echo "Abcd? Doi"|gawk '{print gensub(/([?-]) ([A-Z])/, "_\\2", "G" ,$0)}'