大きなファイルから特定のコードのコメントを外します。

大きなファイルから特定のコードのコメントを外します。

Ubuntu 15のファイルには次のコード行があります/etc/bash.bashrc。ファイル内の他のコメントを混乱させずにコマンドラインからこの行だけコメントを削除するにはどうすればよいですか?

# enable bash completion in interactive shells
#if ! shopt -oq posix; then
#  if [ -f /usr/share/bash-completion/bash_completion ]; then
#    . /usr/share/bash-completion/bash_completion
#  elif [ -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#  fi
#fi

必要な出力は次のようになります。

# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

このファイルには、私が混乱させたくない他のコード行があることに注意してください。これはbashスクリプトによって自動的に実行されるはずです。

答え1

実際にこれを要求することは、マルチプロファイルbashrcを実行する非常に間違った方法です。基本的な.bashrcファイルのさまざまな要件を定義し、必要に応じてインポートできる.bashrc_1、.bashrc_rc2など、いくつかの異なる.bashrcファイルが必要です。

それはすべてです。

答え2

文書全体を見ないと、明確な回答はできません。そして`のインスタンスが1つしかない場合は、if ! shopt -oq posix;それを使用して関連部分を区別できます。

perl -i -pe '$i++ if /^#if ! shopt -oq posix;/; s/^#// if $i==1; $i=0 if /^fi/' /etc/bash.bashrc 

スクリプトは、で始まる行に最初に会うように$i設定されています。 (代替演算子がこの時点でコメントを解除したためではなく)で始まる行を見つけた場合は、リセットします。次に、その行の先頭からコメントを削除します。1#if ! shopt -oq posix;0fi#fi$i1

ノート

  • 次に始まる行が 2 つ以上の場合#if ! shopt -oq posix;
  • 後にスペースがあると失敗します#

より良いアプローチは、関連セクションが他のコンテンツと明確に区​​別されるようにファイルを編集することです。たとえば、次のようにXXXstartなりますXXXend

その後、より一般的なアプローチをとることができます。

# enable bash completion in interactive shells
# XXXstart
#if ! shopt -oq posix; then
#  if [ -f /usr/share/bash-completion/bash_completion ]; then
#    . /usr/share/bash-completion/bash_completion
#  elif [ -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#  fi
#fi
#XXXend

次に、ファイルで次のスクリプトを使用します。

 perl -i -pe '$i=0 if /XXXend/; s/^\s*#*// if $i==1; $i=1 if /XXXstart/; ' /etc/bash.bashrc

最後にしないでください。いたずらしないでください/etc/bash.bashrc。次の行を追加します。あなたの ~/.bashrc/etc/bash.bashrcまず、よりクリーンで安全なので、2番目にファイルへのすべての変更が次の更新で上書きされるためです/etc

答え3

  1. に接続する一時ファイルを作成してみてはいかがですか /etc/bash.bashrc

    cat /tmp/posix-opt.txt >> /etc/bash.bashrc
    

(これにより、/etc/bash.bashrcに/tmp/posix-opt.txt(コメントアウトされていない行を含む)が追加されます。)

  1. できない場合

    n=$(grep -n 'shopt -oq posix' /etc/bash.bashrc)
    sed -i -e "$n,$(($n + 7))s/^#//" /etc/bash.bashrc
    

これはviと同じです。行番号を取得するにはgrepだけです。

ただし、2行に「shopt -oq posix」が含まれているとスクリプトが中断されることに注意してください。

答え4

私が提案したこのソリューションは少し準備が必要ですが、私は大丈夫です。


まず、ソースファイルを一時フォルダにコピーします。

cp /etc/bash.bashrc /var/ldt/bash.bashrc_modifed

次に、/var/ldt/bash.bashrc_modifedで必要なものだけを編集します。

以下を実行してパッチを作成します。

diff -u /etc/bash.bashrc /var/ldt/bash.bashrc_modifed > /var/ldt/bash.bashrc_patch

これで、実際に必要な部分にのみ変更を適用できます。

patch /etc/bash.bashrc < /var/ldt/bash.bashrc_patch

関連情報