检索两个术语之间的文本

时间:2015-02-27 00:27:04

标签: bash sed

我已经看过几个与这个问题相关的答案,但是,我仍然无法得到我需要的工作。

基本上,我正在写一篇在标记容器中使用书目代码的论文。这可能以多种方式发生,例如:

\citet{bibcode}
\citep{bibcode}
\citet{bibcode1,bibcode2}
\citep[randomtext]{bibcode}

我正在尝试编译纯粹这些bibcodes的列表。如果单个容器中有多个bibcodes,则用逗号分隔。

目前,我正在使用:

sed -n 's:.*\cite.*{\(.*\)}.*:\1:p' sample.tex

它适用于某些情况,但不适用于所有情况。它似乎仍然被大括号的其他用途分散注意力,并且会拾取大量不必要的文本。

对此事的任何帮助都将受到高度赞赏。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

假设每行上只有一个引号,你可以调整你的正则表达式:

s:.*\\cite[^{]*{\([^}]*\)}.*:\1:p

答案 1 :(得分:0)

这适用于您提供的示例输入:

$ cat tst.awk
BEGIN { FS="[{},]" }
/\\cite/ {
    for (i=2;i<NF;i++) {
        if (!seen[$i]++) {
            print $i
        }
    }
}

$ awk -f tst.awk file
bibcode
bibcode1
bibcode2

如果您的真实输入比那更复杂/难以解析,那么请更新您的问题以显示一些输入,以更准确地演示您的问题以及您正在寻找的相关输出。