我在 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
如果没有看到整个文件,我无法给你明确的答案。如果只有一个if ! shopt -oq posix;
and ` 实例,您可以使用它来分隔相关部分:
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
笔记
- 如果您有多于一行以
#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
.首先是因为它更干净、更安全,其次是因为您对文件所做的任何更改都/etc
将被下一次更新覆盖。
答案3
为什么不创建一个临时文件来连接呢
/etc/bash.bashrc
?cat /tmp/posix-opt.txt >> /etc/bash.bashrc
(这会将 /tmp/posix-opt.txt (包含未注释的行)添加到 /etc/bash.bashrc )
如果不可能的话
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