我目前有一组经常使用的默认 LaTeX 包,格式如下:
package1
[options]package2
[options]package3
package4
...
我希望能够将其转换为 \usepackage[options]{package} 或 \usepackage{package} 的标准 LaTeX 表示法,具体取决于包是否有其他选项。我已经成功创建了 sed/regex 命令来转换带有选项的行,但它错过了没有选项的包。
echo "[option]package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> \usepackage[option]{package}
当它在只有一个包的线上运行时,它会失败(正如我所期望的)。
echo "package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> package
这是正则表达式问题吗?如果是,我应该如何处理?
答案1
请验证这是否适合您:
$ echo -e "[options]package3\npackage4" | sed 's/^\(\[[^]]*\]\)\?\(.*\)/\\usepackage\1{\2}/'
\usepackage[options]{package3}
\usepackage{package4}
我替换.*
为^
以匹配行的开头,并添加\?
以使括号可选。
答案2
这种两步方法似乎更简单:
$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
- 第一步,
s/[^]]*$/{&}/
通过匹配除 之外的最长可能字符串]
,将项目名称放入大括号中,直到行尾。 - 第二步
s/^/\\usepackage/
,简单地添加\usepackage
到行的开头。