bash/awk/sedで標準入力のデータを使用してファイルを内部で変更する方法

bash/awk/sedで標準入力のデータを使用してファイルを内部で変更する方法

bashでファイル(例えば.bashrc)を必要とする単純なコマンドや関数を作成したいと思います。

alias ..="cd .."
alias ls="ls -hNFCs --color=auto -I NTUSER.DAT\* -I ntuser.dat\*"
alias mv="mv -i"
alias cp="cp -i"
alias rm="rm -i"
alias df="df -h"
alias du="du -h"
alias curl="curl -s"
alias c1="awk '{ print \$1 }'"
alias c2="awk '{ print \$2 }'"
alias c3="awk '{ print \$3 }'"
alias c4="awk '{ print \$4 }'"
alias dcp="docker container prune -f"
alias sup="scoop update \*"
###
alias docker='docker -C /trajano/docker'

その後、機能を使って次のことをしたいと思います。

pullbashrc() {
  COMMONRC=$(curl -s https://gist.github.com/trajano/myrc)
  CUSTOMRC=$(??all contents from ### and including ###)
  echo $COMMONRC $CUSTOMRC > ~/.bashrc
}

したがって、Gistのbashrcを結合しますが、ローカルカスタマイズを追加します。CUSTOMRC

CUSTOMRCを実行する方法を知っているようです。

tail -n +$(grep -n "###" ~/.bashrc | cut -d ':' -f1) ~/.bashrc

私が望む通りになるようです。いくつかの点だけを組み合わせると答えが得られるようです。

答え1

これが私が終わったものです。一時ファイルを削除できたらいいのに

pullbashrc() {
  curl -s https://gist.githubusercontent.com/trajano/71553de32f335092ad62f2f301cadd0f/raw/7006ef1c1bf10520e47089b385b8f9670d5ce96e/.bashrc > /tmp/bashrc
  tail -n +$(egrep -n "^###" ~/.bashrc | cut -d ':' -f1) ~/.bashrc >> /tmp/bashrc
  mv -f /tmp/bashrc ~/.bashrc
}

答え2

プライベートbashrcコンテンツを別々のファイルに分割してインポートすることを検討してください。

ワンタイム設定:

sed -n '/^###/,$p' ~/.bashrc > ~/.bashrc.personal

エイリアス定義:

alias pullbashrc='{ curl -s https://gist.githubusercontent.com/trajano/71553de32f335092ad62f2f301cadd0f/raw/7006ef1c1bf10520e47089b385b8f9670d5ce96e/.bashrc; [ -r ~/.bashrc.personal ] && printf '\n%s\n' "source ~/.bashrc.personal"; } > ~/.bashrc'

既存のファイルに末尾の改行が含まれていないようであるため、前に改行を含めました。それ以外の場合、追加の行は無害になります。複合ステートメントには、~/.bashrc.personal出力に含めるように要求する前に読み取り可能なファイルがあることを確認するテストがあります。

私がこれをやったら、私はあなたがしたように機能の方向に行き、いくつかのエラーチェック(おそらくネットワーク接続が閉じられているかもしれません)を追加し、切り捨てによって既存のファイルの~/.bashrc内容が削除されないようにします。

関連情報