如何在 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
}

所以它将结合我的 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截断的方式破坏现有文件内容。

相关内容