正規表現の文字の近くの複数行を置き換える方法は?

正規表現の文字の近くの複数行を置き換える方法は?

これは「mysqld」というソースファイルの一部です。

exit $r
    ;;
  'bootstrap')
      if test "$_use_whatever" == 1 ; then
        log_failure_msg "Please use galera_new_cluster to start the mariadb service with --wsrep-new-cluster"
        exit 1
      fi
      # Bootstrap the cluster, start the first node
      # that initiate the cluster
      echo $echo_n "Bootstrapping the cluster.. "
      $0 start $other_args --wsrep-new-cluster
      exit $?
      ;;
  *)
      # usage
      basename=`basename "$0"`

「ブートストラップ」セクション(例:>> 'boostrap'... *)<<を除く)のすべての内容を「{NEW_BOOTSTRAP_CODE}」に変更したいと思います。だから私はそれが次のようになりたいです:

exit $r
    ;;
  'bootstrap')
     {NEW_BOOTSTRAP_CODE}
  *)
      # usage
      basename=`basename "$0"`

さまざまなsedとperlの正規表現を試しましたが、一重引用符や括弧が付いているようです。これは私の最も失敗した試みです:

perl -i -0777 -pe 's/\'bootstrap\'\)/.+\*\)/{BOOTSTRAP_CODE}/g' /etc/init.d/mysqld

違いがある場合は、Raspberry Pi用です。

答え1

sed "/^[[:blank:]]*'bootstrap')/,/^[[:blank:]]*\*)/c \\
  'bootstrap')\\
    {NEW_BOOTSTRAP_CODE}\\
  *)" script.sh

これは以下に適用されます。sed 変化command() を から までのc行範囲に変換します。この行は次に置き換えられます。script.sh/^[[:blank:]]*'bootstrap')//^[[:blank:]]*\*)

  'bootstrap')
     {NEW_BOOTSTRAP_CODE}
  *)

関連情報