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
허용하는 옵션을 추가합니다 .sed
sed -n -i -e 'the previous sed command'