取消注释较大文件中的特定代码

取消注释较大文件中的特定代码

我在 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 

该脚本设置$i1第一次遇到以 开头的行#if ! shopt -oq posix;。如果遇到以(不是,因为替换运算符此时将取消注释它)0开头的行,它会将其设置回。然后,如果是,它会从行的开头删除注释。fi#fi$i1

笔记

  • 如果您有多于一行以#if ! shopt -oq posix;
  • 如果后面有空格的话就会失败#

更好的方法是编辑文件,以便使用其他内容清楚地分隔相关部分。例如,XXXstartXXXend

然后,您可以采取更通用的方法:

# 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

  1. 为什么不创建一个临时文件来连接呢 /etc/bash.bashrc

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

(这会将 /tmp/posix-opt.txt (包含未注释的行)添加到 /etc/bash.bashrc )

  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

相关内容