더 큰 파일에서 특정 코드의 주석 처리를 제거합니다.

더 큰 파일에서 특정 코드의 주석 처리를 제거합니다.

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;이를 사용하여 관련 부분을 구분할 수 있습니다.

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

노트

  • 다음으로 시작하는 행이 두 개 이상인 경우#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

  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만 하면 됩니다.

그러나 두 줄에 "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

관련 정보