sedまたはawkを使用してソースコードのセクションにコメントアウト/コメントインするにはどうすればよいですか

現在、次のようなセクションを含むファイルがあります

code statement1 code statement2 # BEGIN SOMENAME some code some other code # END SOMENAME code statement n +1 code statement n +1 

「#BEGINSOMENAME」と「#END」の間にあるものをコメントアウトして、最終的には次のようになります

code statement1 code statement2 # BEGIN SOMENAME # some code # some other code # END SOMENAME code statement n +1 code statement n +1 

awkまたはsedでこれを実現できますか?簡単に元に戻すことはできますか?それで、もう一度「コメント」する操作だけですか?

間違いを犯さないようにしたいので、すでにコメントアウトされている行はそのままにしておく必要があります。また、「コメントイン」では、終了と開始の間の行が「#」で始まらない場合は、何かをしようとしないでください。

数時間試してみましたが、成功しませんでした。

考えられる解決策を見つけました:

awk " BEGIN { i=0; line_with_no_comment_found=0 } /^# END/ { m=0; if ( line_with_no_comment_found == 1 ) { for (var in a) print "# "a[var] } else { for (var in a) print a[var] } delete a; i=0; line_with_no_comment_found=0; } /^# / { if (m==0) { print } else { a[i++]=$0; } } !/^# / { if (m==0) { print } else { a[i++]=$0; line_with_no_comment_found=1} } /^# BEGIN ([a-zA-Z_])([1-9][0-9]*)*/ {m=1;} END { } "<<EOF 

コメント

  • おそらく、この古いコードが原因です複数の開始行(コピー/貼り付けのバグ…?)のような間違いがあり、最初の行を無視するか、開始が開始してファイルが終了する場合があります。…i 'このスクリプトを投稿するのではなく、今は完全に壊れています…
  • その通りです。これを課題に追加しました。申し訳ありませんが、疲れました。部分的な解決策を見つけたときは、他のすべてが機能しなくなるようです。

回答

このスクリプトは私のために働きます。 GNU Awk 4.0.1でテストしましたが、Nawkでも動作するはずです。

awk "BEGIN { # action=0: uncomment # action=1: comment action=0 in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1" 

付随する小さなシェルスクリプトも作成しました:

#!/usr/bin/env sh syntax_error() { echo "Usage: `basename \"$0\"` [comment|uncomment] file" >&2 exit 1 } case "$1" in 0|uncomment) action=0; ;; 1|comment) action=1; ;; *) syntax_error; ;; esac shift if [ -z "$@" ]; then syntax_error; fi awk "BEGIN { action="$action" in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1" "$@" > "[email protected]" if [ $? -eq 0 ]; then mv "[email protected]" "$@"; fi 

(GNU Awk 4.1.0以降を使用している場合は、最後に移動構文の代わりに-iフラグを使用できます。)

コメント

  • @Mandragor開始コメントと終了コメントのSOMENAMEが一致する必要がある場合は、私に一言お願いします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です