sed에서 이 대체를 수행하는 방법은 무엇입니까?

sed에서 이 대체를 수행하는 방법은 무엇입니까?

다음 텍스트가 있습니다.

Table {\label{seq:ref176}} - Table name.




\begin{longtable}{|m{3.36636in}|m{3.36636in}|}

다음과 같이 편집하고 싶습니다.

\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption{Table name \label{seq:ref176}}\\

나는 다음과 같이 이것을 할 수 있습니다 Atom:

찾다:Table \{\\label\{(.*?)\}\} - (.*?).\n*\\begin\{longtable\}\{(.*?)\|\}

바꾸다:\begin{longtable}{$3|}\n\\caption {$2 \\label{$1}}\\\\

sed에서 이 작업을 시도했지만 작동하지 않습니다. 오류가 없습니다. 일치하는 항목을 찾을 수 없습니다.

s/Table\ \{\\label\{(.*?)\}\}\ \-\ (.*?)\n*\\begin\{longtable\}\{(.*?)\|\}/\\begin\{longtable\}\{\3\|\}\n\\caption\ \{\2\ \\label\{\1\}\}\\\\/g

답변1

Perl one-liner가 옵션인 경우 다음을 시도해 보십시오.

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

답변2

귀하의 시도에는 하나의 개념적 오류와 하나의 사소한 오류가 있습니다.

개념은 sed파일을 한 줄씩(기본적으로) 자세히 설명한다는 것입니다. 운 좋게도 GNU sed는 매개변수가 전달되면 파일 전체에 대해 작업할 수 있습니다 -z.

사소한 수정은 \.원하는 출력을 얻기 위해 누락된 부분을 추가하는 것입니다. 표현이 너무 길고 지저분하면 그런 사소한 것들을 발견하기가 정말 어렵기 때문에 당신을 비난하지 않습니다.

명령줄:

sed -rz 's/Table\ \{\\label\{(.*?)\}\}\ \-\ (.*?)\.\n*\\begin\{longtable\}\{(.*?)\|\}/\\begin\{longtable\}\{\3\|\}\n\\caption\ \{\2\ \\label\{\1\}\}\\\\/g' file

산출:

\begin{longtable}{|m{3.36636in}|m{3.36636in}|}
\caption {Table name \label{seq:ref176}}\\

참조GNU sed에서선적 서류 비치:

'-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.

답변3

나는 Python에서 전체 파일을 작업하는 것이 더 쉽기 때문에 python보다는 스크립트를 작성하는 것을 선호했습니다 .sed

#!/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)

관련 정보