sed는 일치하는 텍스트를 잘라내어 파일 시작 부분에 붙여넣습니다.

sed는 일치하는 텍스트를 잘라내어 파일 시작 부분에 붙여넣습니다.

디렉터리에 많은 수의 텍스트 파일이 있고 첫 번째 주석 섹션을 잘라내어 파일 시작 부분에 붙여넣고 싶습니다(주석 텍스트는 길이와 시작 지점이 다르며 경우에 따라 존재하지 않을 수도 있음). 처음 50줄에 위치). 나는 bash 코드를 사용하여 모든 파일을 처리한 다음 각 파일 이름에 sed를 사용하여 '''와 ''' 사이에 포함된 주석 텍스트의 첫 번째 블록을 잘라서 파일의 맨 위로 이동할 생각입니다. 처음에는 sed를 사용하여 일치하는 텍스트 블록을 찾은 다음 sed를 사용하여 공간을 보존하는 중첩된 sed 명령이 필요하다고 생각하는 문제로 어려움을 겪고 있습니다. 우분투23.04

원본 샘플:

from itertools import permutations
import time

'''
Here is some comment text
that should be at start of file
some more lines
'''

def somepythoncode(x):
    return x+1

표적:

'''
Here is some comment text
that should be at start of file
some more lines
'''
from itertools import permutations
import time

def somepythoncode(x):
    return x+1

답변1

그리고 ed:

printf '%s\n' "/^'''$/; // m 0" wq | ed -s file.py
  • /^'''$/;주어진 표현식과 일치하는 첫 번째 줄로 커서를 이동합니다.
  • m 0주소가 지정된 행을 행 0 다음의 행으로 이동합니다(즉, 맨 위에 삽입합니다). 주소는 이며 //, 이는 가장 최근에 일치하는 정규 표현식이 ^'''$재사용됨을 의미합니다. 이는 다음과 같이 사용됩니다.명령의 주소입니다. 이것시작주소는 암시적입니다 .(현재 행).
  • wq변경 사항을 파일에 다시 씁니다.

/^'''$/; //+1 m 0다른 선을 사용하여 끝 범위를 확장 할 수 있습니다 .

답변2

awk를 사용하십시오.

$ cat whatever.py
from itertools import permutations
import time

'''
Here is some comment text
that should be at start of file
some more lines
'''

def somepythoncode(x):
    return x+1

$ cat tst.sh
#!/usr/bin/env bash

for file; do
    awk -v delim="'''" '
        $0 == delim { dnr[++cnt] = NR }
        { rec[NR] = $0 }
        END {
            if ( 2 in dnr ) {
                for ( i=dnr[1]; i<=dnr[2]; i++ ) {
                    print rec[i] > FILENAME
                    delete rec[i]
                }
                for ( i=1; i<=NR; i++ ) {
                    if ( i in rec ) {
                        print rec[i] > FILENAME
                    }
                }
            }
        }
    ' "$file"
done

$ ./tst.sh whatever.py

$ cat whatever.py
'''
Here is some comment text
that should be at start of file
some more lines
'''
from itertools import permutations
import time


def somepythoncode(x):
    return x+1

위의 내용은 파일이 메모리에 들어갈 만큼 크지 않다고 가정합니다(예: 길이가 수백만 줄 미만).

답변3

다음 명령을 사용하여 주석 블록을 추출할 수 있습니다.

$ awk "/'''/{p=! p;print;next}p" infile 
'''
Here is some comment text
that should be at start of file
some more lines
'''

그러면 다음이 남게 됩니다:

$ awk "/'''/{p=! p;next};p==0{print}" infile 
from itertools import permutations
import time


def somepythoncode(x):
    return x+1

두 가지를 결합하면 최종 결과가 제공됩니다.

$ (awk "/'''/{p=! p;print;next}p" infile; awk "/'''/{p=! p;next};p==0{print}" infile)
'''
Here is some comment text
that should be at start of file
some more lines
'''
from itertools import permutations
import time


def somepythoncode(x):
    return x+1

관련 정보