입력 파일입니다
def test():
print('do something')
#>#> this does something
return 0
def new_test(arg):
# >#>this too does something
x = 0
y = 1
return x+y
def main():
test()
z = 'hello'
# ># this should not work
return null
if __name__ == '__main__':
# >#> main call
main()
출력은 다음과 같아야 합니다.
def test():
print('do something')
some_fn("this does something")
return 0
def new_test(arg):
some_fn("this too does something")
x = 0
y = 1
return x+y
def main():
test()
z = 'hello'
# ># this should not work
return null
if __name__ == '__main__':
some_fn("main call")
main()
주석 문자열을 추출하는 방법을 찾을 수 없습니다.
답변1
표준을 사용하면 sed
다음과 같습니다.
sed 's/# *>#> *\(.*\)/some_fn("\1")/' file
- 귀하의
#>#>
패턴이 추가 공간을 허용하는 것 같아서 이를# *>#> *
패턴으로 사용했습니다. 다른 공간이 허락한다면 조정하세요. .*
나머지 줄과 일치합니다.\(\)
교체시 참조할 수 있도록 내부에 넣었습니다.\1
답변2
GNU sed
정규식 옵션을 사용하고 확장하여 이 작업을 빠르게 수행할 수 있습니다 -E
.
$ sed -Ee 's/^(\s+)#\s*>#>\s*(\S.*)/\1some_fn("\2")/' file
- ^(\s+)는 들여쓰기 수준을 기억합니다.
- # 및 >#>는 두 개의 문자열이며 선택적으로 공백이 뒤따릅니다.
- (\S.*)는 메시지 부분을 저장합니다.
- 그런 다음 교체 부분에서 들여쓰기 수준
\1
과 메시지를 검토\2
하고 some_fn 문자열을 펼칩니다.
또는 를 사용하여 메시지의 들여쓰기 수준이 다음 과 같도록 awk
필드 구분 기호를 정규식으로 선택합니다.#\s*>#>\s*
$1
$2
$ awk '
BEGIN {
s = "[[:blank:]]*"
FS = "#" s ">#>" s
OFS = ""; q = "\""
}
NF > 1 {
$2 = "some_fn(" q$2q ")"
}1
' file