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+) はインデントのレベルを覚えています。
  • #と>#>は2つの文字列で、オプションでスペースが続きます。
  • (\S.*) はメッセージ部分を保存します。
  • 次に、置換部分でインデントレベルと\1メッセージを確認し、\2some_fn文字列を展開します。

またはを使用して、メッセージのインデントレベルが次のようになるように、フィールド区切りawk文字を正規表現として選択します。#\s*>#>\s*$1$2

$ awk '
    BEGIN {
      s = "[[:blank:]]*" 
      FS = "#" s ">#>" s
      OFS = ""; q = "\""
    }
    NF > 1 {
      $2 = "some_fn(" q$2q ")"
    }1
' file

関連情報