我想写下我的毕业论文。可悲的是,没有完美的编辑,所以我不得不即兴发挥。对于bibtex引用,我想在处理pandoc的输入之前,使用bash-filter来转换我自己的定义:
<@BIBTEX_ID[|OPTIONAL_PAGE_OR_CHAPTER_NUM[|OPTIONAL_UNIT_DEFINITION]]>这样的事情:
\autocite[OPTIONAL_UNIT_DEFINITION][OPTIONAL_PAGE_OR_CHAPTER_NUM]{BIBTEX_ID}示例:
<@sample> ---> \autocite{sample}
<@sample|12> ---> \autocite[12]{sample}
<@sample|12|c.> ---> \autocite[12][c.]{sample}哪个bash/unix工具可以完成这项工作?用sed或awk可以做到这一点吗?
发布于 2014-08-20 07:02:59
您可以直接使用sed:
sed -e 's/<@\([^|>]*\)|\([^|>]*\)|\([^>|]*\)>/\\autocite[\2][\3]{\1}/g' \
-e 's/<@\([^|>]*\)|\([^|>]*\)>/\\autocite[\2]{\1}/g' \
-e 's/<@\([^|>]*\)>/\\autocite{\1}/g'这只是分别替换了每个可能的公式:首先处理三个参数的引用,然后是两个,然后是一个。每个可选块都与\([^|>]*\)匹配,并被\1...3替换为输出。
发布于 2014-08-20 08:09:11
sed '/^<@\([^|]*\)\(.*\)>/!b
s//\\autocite\2{\1}/
s/|/[/;s/|/][/g;/\[/s/{/]{/
' <<\DATA
<@sample>
<@sample|12>
<@sample|12|c.>
DATA\autocite{sample}
\autocite[12]{sample}
\autocite[12][c.]{sample}sed所做的第一件事是验证它正在处理的行是从<@开始的,然后是一个>。如果该行与该模式不匹配,则b牧场将退出脚本,开始下一个行循环,然后再试一次。
但是,如果它确实匹配,sed会执行一些双重任务:将\1引用到@后面的所有或任何字符(这不是|字符),并在第一个序列后面的所有或任何字符引用\2,直到最后一行>出现为止。在下一行(只有当第一行匹配时才到达),sed从第一个地址借用这些引用,并将整个字符串替换为\\autocite\2{\1}。
在下面的行中,sed尝试用[替换|字符的第一次出现,然后用][替换更多的|字符,最后,如果行上存在[,则用]{替换{的第一次出现。
sed所做的一切都是简单明了的。sed所做的一切都是它刚才所做的事情的直接结果。sed明显地--有时令人恼火--井然有序。
顺便说一句--这应该处理尽可能多的|分隔参数,就像在单行上指定的那样--它不限于两个。但是,[<>@|{}]令牌和行位置必须得到尊重--至少按照所写的那样。只要你遵守规则,sed肯定不会违反任何规则。
https://unix.stackexchange.com/questions/151074
复制相似问题