Wie führe ich diese Ersetzung in sed durch?

Wie führe ich diese Ersetzung in sed durch?

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}}\\

AtomIch 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 sedist, dass es Dateien Zeile für Zeile ausarbeitet (standardmäßig). Glücklicherweise kann GNU sed die Datei als Ganzes bearbeiten, wenn ihm der -zParameter ü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 pythonstatt 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)

verwandte Informationen