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