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
:
#
5番目の記録の後、記録の最初から次の内容が削除されます。
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'