sedを使用して.bashrcのPATH変数を更新します。

sedを使用して.bashrcのPATH変数を更新します。

PATH変数を.bashrcファイルに入れて永久に更新しようとしました。ただし、ファイルに追加したくないので、現在のPATH = ..... ...をセッションに使用するPATH変数に置き換えます。これが私が今まで持っているものです:

sed 's/^PATH=.*/${PATH=$PATH}/' .bashrc > .bashrc

これはオンラインで見たコマンドが混乱します。これを実行すると、.bashrc PATH行がすべてのエントリで上書きされます。過去1時間に得たsedの知識にawkのような試みを放棄せずに追加したいので、sedを使用する解決策があることを願っています.

ベストアンサー1

まず、読んでいるファイルに書き込まないでください。最終的にファイルが削除されることがあります。代わりに内部編集機能(-i)を試してください。

次に、二重引用符()内では変数置換が機能しないため、そこで拡張置換を実行するには'別の操作を実行する必要があります。$PATH

最後に、代替構文を破る文字が$PATH含まれる可能性があるため、別の区切り文字を使用する必要があります。/sed

パスに;sが含まれていないとし、次のことを試してください(もちろん、現在のファイルをバックアップした後)。

sed -i 's;^PATH=.*;PATH='"$PATH"';' .bashrc

置換の一致部分は次のことを意味します。^()で始まりPATH=、後ろにランダムな文字(.)が数回(*)で来る文字列と一致します。つまり、正確な先頭の行と一致しますが、PATH=中間のどこかの行は一致しません。PATH=これは.*ライン全体を交換したいので重要です(ラインなしで試してみて、何が起こっているのかを確認してください)。

$PATH$PATH空白文字の包含を考慮して代替引用が必要です。

デモ:

$ foo=bar
$ echo hello | sed -e 's/hello/$foo/'
$foo

環境。変数は二重引用符内で置き換えられません。だから$fooそこには文字通りの意味があります。これで、シェルがハード引用符を削除してそれを拡張するようにします。

$ foo=bar
$ echo hello | sed -e 's/hello/'$foo'/'
bar

いいね!しかし、これは安全ではありません。

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'$foo'/'
sed: -e expression #1, char 11: unterminated `s' command

sed上記の2つの引数を受け取った後、それぞれ-es/hello/barbaz/。悪い。この問題を解決するには、より多くの引用が必要です。

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz

"環境変数を他のものに引数として渡すときは、環境変数を引用符で囲む必要があります。それ以外の場合は($IFS変更されていないと仮定すると)スペースに分割されます。

おすすめ記事