pyenvインストール手順の高度なsedコマンド

pyenvインストール手順の高度なsedコマンド

ピエンフ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

どのように動作しますか?

ベストアンサー1

表示されるコマンドは、ファイルに2行のテキストを追加します~/.profile。この行は

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

コマンドによって追加されますa(GNUコマンドは1行に1回使用されるため、sed不要です)。正規表現が一致すると、コマンドがa実行されます。正規表現は、a^([^#]|$)#開始されていないか空の最初の行と一致します。行が追加されます。後ろにそのトリガーライン。

最後は、次の行を読み、印刷し、ファイルの最後まで続けて文書の残りの部分をそのまま残すことを可能にする明示的なループです。これにより、正規表現に一致する各行の後に2行のテキストを追加するのを防ぎ、両方のコマンドを実行します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最初のコメントブロックの後の最初の行の後に行を追加する代わりに、最初のコメントブロックの後に行を追加するには、コードの2つのブロックを置き換えます。


同じ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

おすすめ記事