디렉터리에 많은 수의 텍스트 파일이 있고 첫 번째 주석 섹션을 잘라내어 파일 시작 부분에 붙여넣고 싶습니다(주석 텍스트는 길이와 시작 지점이 다르며 경우에 따라 존재하지 않을 수도 있음). 처음 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