AWK:匹配捕获组内的字符

时间:2016-10-09 23:28:59

标签: regex awk

例如,我在文本中有这样的引用组,如

Lorem ipsum \textbf{dolor} sit amet \cite{a,b,c,d,e}, consectetur adipiscing elit. In molestie urna et dui $\mu=\text{a b c}$ venenatis pretium. Duis sit amet metus orci \cite{a,b,c,d,e}. Nunc non lobortis arcu, sit amet imperdiet diam \cite{b,e,f}.  

在乳胶文件中。可能存在许多这样的段落。

我希望匹配,命令中的所有逗号\cite以替换为其他字符,请与.一起使所有引文变为\cite{a.b.c.d.e},{{ 1}},保持文本相同。

所以输出应该是

\cite{b.e.f}

1 个答案:

答案 0 :(得分:1)

您的问题尚不清楚,但这是您想要的吗?

$ awk -F, 'match($0,/\\cite\{([^\}]+)/,a) {$0=a[1]; for (i=1; i<=NF; i++) print NR, i, $i}' file
1 1 a
1 2 b
1 3 c
1 4 d
1 5 e
2 1 b
2 2 e
2 3 f

以上使用GNU awk为第3个arg匹配()。如果你想做的就是将,更改为.只是:

$ awk -F, 'match($0,/(.*\\cite\{)([^\}]+)(.*)/,a) {gsub(/,/,".",a[2]); $0=a[1] a[2] a[3]} 1' file
\cite{a.b.c.d.e}
\cite{b.e.f}

鉴于您新发布的样本输入输出:

$ awk -v RS='[\\]cite[{][^}]+[}]' '{ORS=gensub(/,/,".","g",RT)} 1' file
Lorem ipsum \textbf{dolor} sit amet \cite{a.b.c.d.e}, consectetur adipiscing elit. In molestie urna et dui $\mu=\text{a b c}$ venenatis pretium. Duis sit amet metus orci \cite{a.b.c.d.e}. Nunc non lobortis arcu. sit amet imperdiet diam \cite{b.e.f}.

仍在使用GNU awk,这次是多字符RS和RT。