
Ich habe diesen Text:
Table {\label{seq:ref176}} - Table name.
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
Ich möchte es wie folgt bearbeiten:
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption{Table name \label{seq:ref176}}\\
Atom
Ich kann das so machen :
finden:Table \{\\label\{(.*?)\}\} - (.*?).\n*\\begin\{longtable\}\{(.*?)\|\}
ersetzen:\begin{longtable}{$3|}\n\\caption {$2 \\label{$1}}\\\\
Ich habe versucht, dies in sed zu tun, aber es funktioniert nicht. Es liegt kein Fehler vor. Ich kann einfach keine Übereinstimmungen finden.
s/Table\ \{\\label\{(.*?)\}\}\ \-\ (.*?)\n*\\begin\{longtable\}\{(.*?)\|\}/\\begin\{longtable\}\{\3\|\}\n\\caption\ \{\2\ \\label\{\1\}\}\\\\/g
Antwort1
Wenn ein Perl-Einzeiler eine Option ist, versuchen Sie es mit:
perl -0777 -pe 's/Table \{(\\label\{.*?\}\}) - (.*?)\.\s+(\\begin\{longtable\}\{.*?\|\})/$3\n\\caption{$2 $1/' file
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption{Table name \label{seq:ref176}}
Antwort2
Ihr Versuch weist einen konzeptionellen und einen kleineren Fehler auf.
Das Konzept von sed
ist, dass es Dateien Zeile für Zeile ausarbeitet (standardmäßig). Glücklicherweise kann GNU sed die Datei als Ganzes bearbeiten, wenn ihm der -z
Parameter übergeben wird.
Die kleine Korrektur besteht darin, ein fehlendes Element hinzuzufügen, \.
um die gewünschte Ausgabe zu erhalten. Ich kann Ihnen das nicht verübeln, denn es ist wirklich schwer, solche winzigen Dinge zu erkennen, wenn der Ausdruck so lang und chaotisch ist.
Befehlszeile:
sed -rz 's/Table\ \{\\label\{(.*?)\}\}\ \-\ (.*?)\.\n*\\begin\{longtable\}\{(.*?)\|\}/\\begin\{longtable\}\{\3\|\}\n\\caption\ \{\2\ \\label\{\1\}\}\\\\/g' file
Ausgabe:
\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption {Table name \label{seq:ref176}}\\
Referenzvom GNU sedDokumentation:
'-z'
'--null-data'
'--zero-terminated'
Treat the input as a set of lines, each terminated by a zero byte
(the ASCII 'NUL' character) instead of a newline. This option can
be used with commands like 'sort -z' and 'find -print0' to process
arbitrary file names.
Antwort3
Ich habe es vorgezogen, das Skript in python
statt zu schreiben sed
, weil es in Python einfacher ist, mit der gesamten Datei zu arbeiten.
#!/usr/bin/python
import re
import argparse
def test_regex(input):
with open(input) as f:
data = f.read()
file = open("output.tex","w")
file.write(data)
file.close()
data = re.sub(r'Table \{\\label\{(.*?)\}\} - (.*?).\s*\\begin\{longtable\}\{(.*?)\|\}',
r'\\begin{longtable}{\3|}\n\\caption {\2 \\label{\1}}\\\\', data)
file = open("output.tex","w")
file.write(data)
file.close()
def main(input):
test_regex(input)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("input")
args = parser.parse_args()
input = args.input
main(input)