bash - 匹配多行括号(使用 awk?)

标签 bash awk sed latex

我想使用 bash 脚本从 LaTeX 文档中过滤掉脚注。它可能看起来像以下任一示例:

Some text with a short footnote.\footnote{Some \textbf{explanation}.}

Some text with a longer footnote.%
  \footnote{Lorem ipsum dolor
     sit amet, etc. etc. etc. \emph{along \emph{multiple} lines}
     but all lines increased indent from the start.}

遗迹应该是:

Some text with a short footnote.

Some text with a longer footnote.%

我不关心额外的空格。

由于匹配括号不能用正则表达式完成,我想我不能为此使用 sedawk 或其他工具是否可行?

最佳答案

使用 GNU awk 将记录拆分为字符的多字符 RS 和空 FS:

$ cat tst.awk
BEGIN { RS="[\\\\]footnote"; ORS=""; FS="" }
NR>1 {
    braceCnt=0
    for (charPos=1; charPos<=NF; charPos++) {
        if ($charPos == "{") { ++braceCnt }
        if ($charPos == "}") { --braceCnt }
        if (braceCnt == 0)   { break }
    }
    $0 = substr($0,charPos+1)
}
{ print }

$ awk -f tst.awk  file
Some text with a short footnote.

Some text with a longer footnote.%

关于bash - 匹配多行括号(使用 awk?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809301/

相关文章:

bash - sed/awk - 在跨越多行的模式之间打印文本

linux - sed中 'Hold space'和 'Pattern space'的概念

linux - 检查 URL 中是否有特定文本的脚本

linux - Awk:对具有相同列布局的多个文件的列值求和

linux - shell find -delete -- 如何避免删除自身

linux - 使用 awk 或 sed 从多个文件中消除重复行

bash - 如果字符出现少于 20 次,则从列中删除字符

linux - 如何从字符串中最后一个定界符的左边获取所有内容?

linux - 运行查找命令并通过电子邮件发送结果

linux - bash shell 脚本和脚本中函数的可变范围