Ich habe derzeit eine Reihe von Standard-LaTeX-Paketen, die ich häufig verwende und die wie folgt formatiert sind:
package1
[options]package2
[options]package3
package4
...
Ich möchte dies in die Standard-LaTeX-Notation \usepackage[options]{package} oder \usepackage{package} konvertieren können, je nachdem, ob das Paket zusätzliche Optionen hat. Ich habe erfolgreich einen sed/regex-Befehl erstellt, um die Zeilen mit Optionen zu konvertieren, aber er vermisst die Pakete ohne Optionen.
echo "[option]package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> \usepackage[option]{package}
Wenn dies in einer Zeile mit nur einem Paket ausgeführt wird, schlägt es (wie erwartet) fehl.
echo "package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> package
Handelt es sich hierbei um ein Regex-Problem und wenn ja, wie gehe ich damit um?
Antwort1
Bitte überprüfen Sie, ob dies für Sie funktioniert:
$ echo -e "[options]package3\npackage4" | sed 's/^\(\[[^]]*\]\)\?\(.*\)/\\usepackage\1{\2}/'
\usepackage[options]{package3}
\usepackage{package4}
Ich habe es .*
durch ersetzt ^
, damit es dem Zeilenanfang entspricht, und hinzugefügt, \?
damit die Klammern optional sind.
Antwort2
Dieser zweistufige Ansatz scheint einfacher zu sein:
$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
- Der erste Schritt,
s/[^]]*$/{&}/
, setzt den Projektnamen in geschweifte Klammern, indem er die längstmögliche Zeichenfolge außer]
bis zum Ende der Zeile abgleicht. - Der zweite Schritt,
s/^/\\usepackage/
, wird einfach\usepackage
dem Zeilenanfang vorangestellt.