我目前有一組經常使用的預設 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
到行的開頭。