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;
0
fi
#fi
$i
1
ノート
- 次に始まる行が 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
に接続する一時ファイルを作成してみてはいかがですか
/etc/bash.bashrc
?cat /tmp/posix-opt.txt >> /etc/bash.bashrc
(これにより、/etc/bash.bashrcに/tmp/posix-opt.txt(コメントアウトされていない行を含む)が追加されます。)
できない場合
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