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つの引数を受け取った後、それぞれ-e
:s/hello/bar
とbaz/
。悪い。この問題を解決するには、より多くの引用が必要です。
$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz
"
環境変数を他のものに引数として渡すときは、環境変数を引用符で囲む必要があります。それ以外の場合は($IFS
変更されていないと仮定すると)スペースに分割されます。