PATH 변수를 .bashrc 파일에 넣어 영구적으로 업데이트하려고 했습니다. 그러나 파일에 추가하고 싶지 않고 현재 PATH=........를 세션에 사용하는 PATH 변수로 바꿉니다. 이것이 내가 지금까지 가지고 있는 것입니다:
sed 's/^PATH=.*/${PATH=$PATH}/' .bashrc > .bashrc
이것은 온라인에서 본 명령이 뒤죽박죽인데, 이를 실행하면 .bashrc PATH 행이 모든 항목으로 덮어쓰여집니다. 지난 한 시간 동안 얻은 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
위의 두 인수가 수신된 후 각각 -e
: s/hello/bar
및 입니다 baz/
. 안좋다. 이 문제를 해결하려면 더 많은 인용문이 필요합니다.
$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz
"
환경 변수를 다른 것에 인수로 전달할 때는 거의 항상 환경 변수를 따옴표로 묶어야 합니다. 그렇지 않으면 ( $IFS
변경되지 않았다고 가정하면) 공백으로 분할됩니다.