入力ファイルです
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
メッセージを確認し、\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