SED 및/또는 AWK를 사용하여 라인을 패턴으로 교체 [닫기]

SED 및/또는 AWK를 사용하여 라인을 패턴으로 교체 [닫기]

입력 파일입니다

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

관련 정보