텍스트 파일에서 여러 줄 문자열의 첫 번째 문자 제거

텍스트 파일에서 여러 줄 문자열의 첫 번째 문자 제거

Ubuntu 20.04 VM의 빌드 프로세스를 자동화하고 있습니다. Ubuntu 20.04에서는 기본적으로 bash 완성 기능이 비활성화되어 있는 것 같습니다. 빌드할 때 이 기능을 기본적으로 활성화하고 싶습니다. 제가 사용하는 수명주기 관리 시스템을 사용하면 가상 머신이 완전히 시작되기 전에 몇 가지 최종 명령을 실행할 수 있습니다. 나에게 필요한 것은 모든 사용자에 대해 bash-completion을 활성화하는 것입니다 /etc/bash.bashrc.

현재 빌드 머신은 /etc/bash.bashrc다음과 같습니다.

# System-wide .bashrc file for interactive bash(1) shells.

...

# 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

...

EOF

#해당 줄 뒤의 모든 문자를 삭제하고 싶습니다 # enable bash completion in interactive shells. 결과는 다음과 같습니다.

# System-wide .bashrc file for interactive bash(1) shells.

...

# 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

...

EOF

명령 을 작성해 보았지만 sed성공하지 못했습니다. 어떤 아이디어라도 크게 감사하겠습니다. 감사해요!

답변1

다음 코드는 #다음 줄부터 다음 # enable bash completion in interactive shells으로 시작하는 마지막 연속 줄 까지 줄 시작 부분의 모든 s를 제거합니다 #.

$ awk '
    f && !sub(/^#/,"") { f=0 }
    $0 == "# enable bash completion in interactive shells" { f=1 }
1' file
# System-wide .bashrc file for interactive bash(1) shells.

...

# 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

...

EOF

답변2

다음과 같이 시도해 보세요.

sed -i -e '/^# enable bash completion/,/^#fi/ {
             s/^#//;
             s/^ enable bash completion/#&/;
           }' /etc/bash.bashrc

## enable bash completion이렇게 하면 으로 시작하는 모든 줄에서 다음 줄로 시작하는 선행 문자가 제거 되고 줄 의 시작 부분 #fi에 접미사가 추가 됩니다 .#enable bash ...

답변3

사용 awk:

#다섯 번째 기록 이후에는 기록의 처음부터 다음 내용이 삭제됩니다 .

awk 'NR>5{sub(/^#/,"");}1' input

또는

awk 'NR==1,/^# enable/{print;next}{sub(/^#/,"");print }' input

NR==1,/^# enable/{print;next}첫 번째 레코드부터 로 시작하는 레코드까지 인쇄합니다 # enable. 이 next성명은 기록에 대해 더 이상의 조치가 취해지지 않을 것임을 의미합니다.

그런 다음 sub()함수는 #레코드의 시작 부분부터 삭제합니다.

또 다른 접근 방식: 이는 다음 awk항목에 설명되어 있습니다.답변@cas로.

awk '/^# enable/,/^#fi/
{if (/^# enable/) ; else sub(/^#/,"")}1' input

답변4

sed -n -e '
 /^# enable bash completion/{
  h 
  :a {
   n
   /^#fi$/!{
    H 
    ba
   }
  }
  g
  s/#//g
  s/.*/#&\nfi/
 }
 p
' data

섹션을 얻으면 예약된 공간에 행을 저장 bash completion하고 마지막 행에 도달할 때까지 각 행을 예약된 공간에 추가합니다 fi. 이 시점에서 예약된 공간의 내용을 가져오고 1) all 을 삭제하고 #2) #앞에 a를 넣고 블록에 enable bash completion ...final을 추가합니다 .fi

파일 자체에 대한 변경을 -i허용하는 옵션을 추가합니다 .sedsed -n -i -e 'the previous sed command'

관련 정보