以下是按预期工作
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)
答案 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)}'