我整个晚上都在寻找,但找不到解决方案。 (我还读过从文本中删除特定的乳胶命令及其后面的右括号)
我有很多 LaTeX 文件,我想从中提取特殊命令的参数到第二个文件中。
请想象一下,一个 LaTeX 文件有很多“短”行,即一个换行符包含所有 80 个字符。因此,所讨论的命令的参数很可能跨越源文件中的不止一行。此外,可能还有一些带有额外花括号的额外 LaTeX 命令,也应该将其提取出来。
Lorem ipsum dolor sit amet, \ltxcmd{consetetur sadipscing} elitr, sed diam
nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
erat, sed diam voluptua. At vero eos et accusam et justo \ltxcmd{duo
dolores \emph{et ea rebum}}. Stet clita kasd gubergren, \ltxcmd{sea takimata
\textbf{sanctus} \emph{est} Lorem} ipsum dolor sit amet. Lorem ipsum dolor sit
amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor
invidunt ut labore et dolore magna aliquyam erat, sed diam
voluptua. At vero eos et accusam et justo duo dolores et ea
rebum.
这应该返回三个参数,如下所示:
{consetetur sadipscing}
{duo dolores \emph{et ea rebum}}
{sea takimata \textbf{sanctus} \emph{est} Lorem}
我先尝试过
cat file1.tex | sed -n 's/.*\\ltxcmd\({[[:alnum:] ]*}\).*/\1/p'
但这结束了在行尾的搜索,因此我尝试了
tr \n ' ' < file1.tex | sed -n 's/.*\\ltxcmd\({[[:alnum:] ]*}\).*/\1/p'
它返回第一次出现的情况,但其余的保持不变。
接下来的尝试是g
在 sed 表达式的末尾添加 a,以便重新开始搜索——没有帮助。
有什么提示吗? bash 和 sed 将受到欢迎。
答案1
这不会回答你的问题,但评论太长了。
在 Bash 或任何命令行中它都会很复杂。我认为,它们的主要困难在于,您必须计算开括号{
来决定哪一个是右括号}
,因为它们可以嵌套在不同的行中。我推荐 Python 脚本作为解决这个问题的最佳工具。
要使用正则表达式,您可以使用 Notpad++(它适用于 wine)。\\ltxcmd(\{.*\})
如果不是{}
我提到的嵌套,类似的东西会起作用。
Python 中正则表达式搜索的起点 https://stackoverflow.com/questions/454456/how-do-i-re-search-or-re-match-on-a-whole-file-without-reading-it-all-into-memor