raratiru Asked: 2022-02-09 01:19:51 +0800 CST2022-02-09 01:19:51 +0800 CST 2022-02-09 01:19:51 +0800 CST pyenv 安装说明中的高级 sed 命令 772 Pyenv存储库,具有以下用于 bash 的 sed 命令: sed -Ei -e '/^([^#]|$)/ {a \ export PYENV_ROOT="$HOME/.pyenv" a \ export PATH="$PYENV_ROOT/bin:$PATH" a \ ' -e ':a' -e '$!{n;ba};}' ~/.profile 这是如何工作的? sed 1 个回答 Voted Best Answer they 2022-02-09T01:43:24+08:002022-02-09T01:43:24+08:00 您显示的命令将两行文本添加到您的~/.profile文件中。线条是 export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" 它们是与a命令一起添加的(GNU命令对每一行sed使用一次,这是不必要的)。只要正则表达式匹配,就会执行a命令。正则表达式将匹配不以开头或为空的第一行。这些行附加在该触发行之后。a^([^#]|$)# 结尾是一个显式循环,它通过读取下一行、打印它并像这样继续直到文件结尾,简单地允许文档的其余部分保持不变。这避免了在匹配正则表达式并触发两个a命令的每一行之后添加两行文本。 该命令的编写相当笨拙,因为需要进行一些分析才能弄清楚它应该做什么。它的要点是,它会~/.profile尽可能早地尝试在文件中任何初始注释块之后的第一行之后插入新内容。它可能应该使用i而不是a在注释之后添加行,而不是在注释之后的第一行之后。 就个人而言,我会在脚本末尾添加以下行: cat >>"$HOME/.profile" <<'PYENV_SETUP_ENDS' export PYENV_ROOT="$HOME/.pyenv" PATH=$PYENV_ROOT/bin:$PATH PYENV_SETUP_ENDS (注意PATH不需要再次导出。) 使用最近的 GNU awk,您可以使用复制sed命令 awk -i inplace ' { print } !a && (/^[^#]/ || length == 0) { print "export PYENV_ROOT=\"$HOME/.pyenv\"" print "PATH=$PYENV_ROOT/bin:$PATH" a = 1 }' ~/.profile 交换awk代码中的两个块以获得在初始注释块之后添加的行,而不是在初始注释块之后的第一行之后。 相同的 GNUsed命令,但进行了一些清理并使用了更多的空气进行演示: sed -i -f - ~/.profile <<'END_SED' /^#/ b a \ export PYENV_ROOT="$HOME/.pyenv"\ PATH=$PYENV_ROOT/bin:$PATH :again $ ! { n b again } END_SED a将命令更改i为直接插入到第一个非注释行之后。
您显示的命令将两行文本添加到您的
~/.profile
文件中。线条是它们是与
a
命令一起添加的(GNU命令对每一行sed
使用一次,这是不必要的)。只要正则表达式匹配,就会执行a
命令。正则表达式将匹配不以开头或为空的第一行。这些行附加在该触发行之后。a
^([^#]|$)
#
结尾是一个显式循环,它通过读取下一行、打印它并像这样继续直到文件结尾,简单地允许文档的其余部分保持不变。这避免了在匹配正则表达式并触发两个
a
命令的每一行之后添加两行文本。该命令的编写相当笨拙,因为需要进行一些分析才能弄清楚它应该做什么。它的要点是,它会
~/.profile
尽可能早地尝试在文件中任何初始注释块之后的第一行之后插入新内容。它可能应该使用i
而不是a
在注释之后添加行,而不是在注释之后的第一行之后。就个人而言,我会在脚本末尾添加以下行:
(注意
PATH
不需要再次导出。)使用最近的 GNU
awk
,您可以使用复制sed
命令交换
awk
代码中的两个块以获得在初始注释块之后添加的行,而不是在初始注释块之后的第一行之后。相同的 GNU
sed
命令,但进行了一些清理并使用了更多的空气进行演示:a
将命令更改i
为直接插入到第一个非注释行之后。