テキストファイルから複数行文字列の最初の文字を削除する

テキストファイルから複数行文字列の最初の文字を削除する

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許可するオプションを追加します。sedsed -n -i -e 'the previous sed command'

関連情報